Вопросы, касающиеся фиктивной функции PHPUnit - PullRequest
5 голосов
/ 15 июня 2010

Может ли кто-нибудь дать мне ссылку на хорошее руководство по макету PHPUnit? Тот, что в официальной документации , кажется недостаточно подробным. Я пытаюсь изучить PHPUnit, читая исходный код, но я не знаком с такими терминами, как средство сопоставления вызовов, средство проверки вызовов, возврат заглушки и т. Д.

Мне нужно знать следующее:

1) Как ожидать нескольких вызовов метода фиктивного объекта, но каждый из них возвращает разные наборы значений?

$tableMock->expects($this->exactly(2))
    ->method('find')
    ->will($this->returnValue(2)); // I need the second call to return different value

2) Как ожидать вызова метода фиктивного объекта с несколькими параметрами?

Ответы [ 2 ]

12 голосов
/ 29 декабря 2010

[ Примечание. Все примеры кода с сайтов, на которые даны ссылки, следуют по ссылкам для более подробных объяснений. ]

Возврат различных значений

(Текущая) документация PHPUnit предлагает использование обратного вызова или onConsecutiveCalls():

$stub->expects($this->any())
      ->method('doSomething')
      ->will($this->returnCallback('str_rot13'));

$stub->expects($this->any())
     ->method('doSomething')
     ->will($this->onConsecutiveCalls(2, 3, 5, 7));

Ожидайте несколько параметров

with() может содержать несколько параметров :

$observer->expects($this->once())
         ->method('reportError')
         ->with($this->greaterThan(0),
                $this->stringContains('Something'),
                $this->anything());

Проверка нескольких вызовов

Хотя и не спрашивайте, по связанной теме (и не в документации по PHPUnit, которую я могу найти), вы можете использовать от at() до , чтобы установить ожидания для нескольких вызовов метода :

$inputFile->expects($this->at(0))
          ->method('read')
          ->will($this->returnValue("3 4"));
$inputFile->expects($this->at(1))
          ->method('read')
          ->will($this->returnValue("4 6"));
$inputFile->expects($this->at(2))
          ->method('read')
          ->will($this->returnValue(NULL));
3 голосов
/ 15 июня 2010

Вы всегда можете создать свои собственные классы макетов (вам не нужно использовать встроенный объект Mock):

class tableMock extends Table {
    public function __construct() {
    }

    public function find($id) {
        return $id;
    }
}

$tableMock = new tableMock();

//Do your testing here...

Если вы хотите провалить тест изнутри макета, просто сгенерируйте исключение ...

...