У меня есть объект PHP, который реализует встроенный интерфейс Countable. Затем я высмеиваю этот объект для юнит-теста:
$mapper = $this->getMockBuilder("Search_Model_Mapper_Search")
->disableOriginalConstructor()
->setMethods(array("find", "count"))
->getMock();
$mapper->expects($this->once())
->method("find")
->with(array("body" => "kajsgfkblkjasfgdjkb"))
->will($this->returnValue($mapper));
$mapper->expects($this->once())
->method("count")
->will($this->returnValue(0));
И тестируемый фрагмент кода выглядит так:
$results = $this->getMapper("fulltext")->find(array("body" => $requestParams['q']));
if (count($results) === 0) {
$this->view->messages[] = "Sorry, no results were found. Please check your search terms and try again";
return;
}
PHPUnit 4.0.17 не распознает использование count () — я должен использовать $results->count()
для утверждения, которое будет выполнено.
В PHPUnit 3.4 такой проблемы не было.
Я не могу найти ничего, чтобы помочь разобраться с этой проблемой в документации PHPUnit — я что-то пропустил?
Count — это внутренняя функция PHP, которая не используется в вашем сценарии. Вы издевались над вызовом getMapper () для подсчета (getMapper->Count()
). Для вашего теста просто издевайтесь над $this->getMapper("fulltext")->find()
и ничего не возвращают, поэтому PHP count () будет равен 0.
Оказывается, я слишком полагался на поведение автозагрузки в Zend-реализации PHPUnit и не смог изменить фиктивные объекты PHPUnit.
В этом конкретном случае подвергаемый пересмотру класс не был автоматически загружен из-за ограничений в Zend / PHPUnit и автозагрузки (тест не загружает все приложение целиком — и не должен, так как это должен быть модульный тест) — это использовалось для вызвать ошибку «класс не найден» в PHPUnit 3.4, но новая реализация PHPUnit 4.x создаст класс-заглушку. Класс-заглушка не реализовывал никаких интерфейсов, поэтому встроенный в PHP count () не знал, что объект был Countable.
Теперь мне потребовался конкретный исходный файл для моделируемого класса, и mock (и встроенный PHP count ()) ведут себя точно так, как я ожидал.