Я пишу модульный тест для метода с использованием PHPUnit. Метод, который я тестирую, вызывает вызов одного и того же метода на одном и том же объекте 3 раза, но с разными наборами аргументов. Мой вопрос похож на вопросы, заданные здесь и здесь
Вопросы, заданные в других сообщениях, связаны с издевательскими методами, которые принимают только один аргумент.
Однако мой метод принимает несколько аргументов, и мне нужно что-то вроде этого:
$mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->with($this->logicalOr($this->equalTo($arg1, $arg2, arg3....argNb), $this->equalTo($arg1b, $arg2b, arg3b....argNb), $this->equalTo($arg1c, $arg2c, arg3c....argNc) ))
Этот код не работает, потому что equalTo()
проверяет только один аргумент. Предоставление ему более одного аргумента вызывает исключение:
Аргумент № 2 PHPUnit_Framework_Constraint_IsEqual :: __ construct () должен быть числовым
Есть ли способ сделать logicalOr
для метода с более чем одним аргументом?
Заранее спасибо.
В моем случае ответ оказался довольно простым:
$this->expects($this->at(0)) ->method('write') ->with(/* first set of params */); $this->expects($this->at(1)) ->method('write') ->with(/* second set of params */);
Ключ состоит в том, чтобы использовать $this->at(n)
, причем n
– это N-й вызов метода. Я не мог ничего сделать с любым из вариантов logicalOr()
я пробовал.
Остановка вызова метода для возврата значения из карты
$map = array( array('arg1_1', 'arg2_1', 'arg3_1', 'return_1'), array('arg1_2', 'arg2_2', 'arg3_2', 'return_2'), array('arg1_3', 'arg2_3', 'arg3_3', 'return_3'), ); $mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->will($this->returnValueMap($map));
Или вы можете использовать
$mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->will($this->onConsecutiveCalls('return_1', 'return_2', 'return_3'));
если вам не нужно указывать входные аргументы
Для других, которые ищут как соответствующие входные параметры, так и обеспечивают возвращаемые значения для нескольких вызовов .. это работает для меня:
$mock->method('myMockedMethod') ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2]) ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);
Если кто-то найдет это, не глядя на соответствующий раздел в документации phpunit, вы можете использовать метод withConsecutive
$mock->expects($this->exactly(3)) ->method('MyMockedMethod') ->withConsecutive( [$arg1, $arg2, $arg3....$argNb], [arg1b, $arg2b, $arg3b....$argNb], [$arg1c, $arg2c, $arg3c....$argNc] ... );
Единственным недостатком этого является то, что код ДОЛЖЕН вызывать MyMockedMethod в порядке поставленных аргументов. Я еще не нашел пути вокруг этого.