Протестируйте этот метод с некоторыми параметрами, среди прочих

Я тестирую метод с phpunit, и у меня есть следующий сценарий:

  • метод 'setParameter' называется нечетным количеством раз
  • метод 'setParameter' вызывается с различными аргументами
  • среди различных аргументов метод 'setParameter' ДОЛЖЕН быть вызван с набором аргументов.

Я пробовал делать это так:

$mandatoryParameters = array('param1', 'param2', 'param3'); foreach ($mandatoryParameters as $parameter) { $class->expects($this->once()) ->method('setParameter') ->with($parameter); } 

К сожалению, тест завершился неудачно, потому что перед вызовом метода с этими параметрами он вызывается с другими параметрами. Ошибка, которую я получаю:

 Parameter 0 for invocation Namespace\Class::setParameter('random_param', 'random_value') does not match expected value. Failed asserting that two strings are equal. 

Попробуйте использовать метод $this->at() . Вы переписываете свой макет каждый раз своей петлей.

 $mandatoryParameters = array('param1', 'param2', 'param3'); $a = 0; foreach ($mandatoryParameters as $parameter) { $class->expects($this->at($a++); ->method('setParameter') ->with($parameter); } 

Это заставит ваш макет ожидать, что setParameter будет называться определенное количество раз, и каждый вызов будет с другим параметром. Вам нужно будет узнать, какой вызов является конкретным для ваших параметров и соответствующим образом скорректировать его. Если вызовы не являются последовательными, вы можете установить ключ, для которого индексируется каждый параметр.

 $mandatoryParameters = array(2 =>'param1', 5 => 'param2', 6 => 'param3'); foreach ($mandatoryParameters as $index => $parameter) { $class->expects($this->at($index); ->method('setParameter') ->with($parameter); } 

Индекс равен нулю, поэтому не забудьте начать подсчет с 0, а не на 1.

http://phpunit.de/manual/current/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers