'return value'
인수에 상관없이 반환하는 PHPUnit 모의 객체가 있습니다 .
// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
->method('methodToMock')
->will($this->returnValue('return value'));
내가 할 수있는 것은 mock 메소드에 전달 된 인수를 기반으로 다른 값을 반환하는 것입니다. 나는 다음과 같은 것을 시도했다.
$mock = $this->getMock('myObject', 'methodToMock');
// methodToMock('one')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('one'))
->will($this->returnValue('method called with argument "one"'));
// methodToMock('two')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('two'))
->will($this->returnValue('method called with argument "two"'));
그러나 이로 인해 모의 객체가 인수로 호출되지 않으면 PHPUnit이 불만을 제기 'two'
하므로 methodToMock('two')
정의가 첫 번째 정의를 덮어 쓴 것으로 가정합니다 .
그래서 내 질문은 : PHPUnit 모의 객체가 인수에 따라 다른 값을 반환하도록하는 방법이 있습니까? 그렇다면 어떻게?
답변
콜백을 사용하십시오. 예 : (PHPUnit 문서와 직결) :
<?php
class StubTest extends PHPUnit_Framework_TestCase
{
public function testReturnCallbackStub()
{
$stub = $this->getMock(
'SomeClass', array('doSomething')
);
$stub->expects($this->any())
->method('doSomething')
->will($this->returnCallback('callback'));
// $stub->doSomething() returns callback(...)
}
}
function callback() {
$args = func_get_args();
// ...
}
?>
callback ()에서 원하는 처리를 수행하고 $ args에 따라 결과를 적절하게 반환하십시오.
답변
최신 phpUnit 문서에서 : “때때로 스텁 된 메소드는 사전 정의 된 인수 목록에 따라 다른 값을 리턴해야합니다. returnValueMap () 을 사용하여 인수를 해당 리턴 값과 연관시키는 맵을 작성할 수 있습니다 .”
$mock->expects($this->any())
->method('getConfigValue')
->will(
$this->returnValueMap(
array(
array('firstparam', 'secondparam', 'retval'),
array('modes', 'foo', array('Array', 'of', 'modes'))
)
)
);
답변
비슷한 문제가있었습니다 (약간 다르지만 … 인수에 따라 다른 반환 값이 필요하지 않지만 두 세트의 인수가 동일한 함수에 전달되는지 확인해야합니다). 나는 다음과 같은 것을 사용했다.
$mock = $this->getMock();
$mock->expects($this->at(0))
->method('foo')
->with(...)
->will($this->returnValue(...));
$mock->expects($this->at(1))
->method('foo')
->with(...)
->will($this->returnValue(...));
foo ()에 대한 두 번의 호출 순서를 알아야하기 때문에 완벽하지는 않지만 실제로는 그렇게 나쁘지 않습니다.
답변
아마도 OOP 방식으로 콜백을 원할 것입니다.
<?php
class StubTest extends PHPUnit_Framework_TestCase
{
public function testReturnAction()
{
$object = $this->getMock('class_name', array('method_to_mock'));
$object->expects($this->any())
->method('method_to_mock')
->will($this->returnCallback(array($this, 'returnCallback'));
$object->returnAction('param1');
// assert what param1 should return here
$object->returnAction('param2');
// assert what param2 should return here
}
public function returnCallback()
{
$args = func_get_args();
// process $args[0] here and return the data you want to mock
return 'The parameter was ' . $args[0];
}
}
?>
답변
그것은 정확히 당신이 묻는 것이 아니지만 어떤 경우에는 도움이 될 수 있습니다.
$mock->expects( $this->any() ) )
->method( 'methodToMock' )
->will( $this->onConsecutiveCalls( 'one', 'two' ) );
onConsecutiveCalls- 지정된 순서로 값 목록을 리턴합니다.
답변
각 요소가 다음의 배열 인 두 레벨 배열을 전달하십시오.
- 첫 번째는 메소드 매개 변수이고 최소값은 리턴 값입니다.
예:
->willReturnMap([
['firstArg', 'secondArg', 'returnValue']
])
답변
다음과 같이 인수를 반환 할 수도 있습니다.
$stub = $this->getMock(
'SomeClass', array('doSomething')
);
$stub->expects($this->any())
->method('doSomething')
->will($this->returnArgument(0));
Mocking documentation 에서 볼 수 있듯이 메소드 returnValue($index)
는 주어진 인수를 반환 할 수 있습니다.