Я тестирую метод с phpunit, и у меня есть следующий сценарий:
Я пробовал делать это так:
$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