PHPUnit MockObjects가 파라미터를 기반으로 다른 값을 반환하도록 하려면 어떻게 해야 합니까?
반환되는 PHPUnit 모의 개체가 있습니다.'return value'
어떤 주장이든 간에:
// 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()에 대한 2개의 호출 순서를 알 필요가 있기 때문에 완벽하지는 않지만 실제로는 나쁘지 않을 것입니다.
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, 'returnTestDataCallback')));
$object->returnAction('param1');
// assert what param1 should return here
$object->returnAction('param2');
// assert what param2 should return here
}
public function returnTestDataCallback()
{
$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 - 지정된 순서대로 값 목록을 반환합니다.
2레벨 배열을 통과합니다.각 요소는 다음과 같은 배열입니다.
- 첫 번째는 메서드 파라미터, 마지막은 반환값입니다.
예:
->willReturnMap([
['firstArg', 'secondArg', 'returnValue']
])
다음과 같이 인수를 반환할 수도 있습니다.
$stub = $this->getMock(
'SomeClass', array('doSomething')
);
$stub->expects($this->any())
->method('doSomething')
->will($this->returnArgument(0));
Mocking 문서에서 볼 수 있듯이 방법은returnValue($index)
지정된 인수를 반환합니다.
이런 거 말하는 거야?
public function TestSomeCondition($condition){
$mockObj = $this->getMockObject();
$mockObj->setReturnValue('yourMethod',$condition);
}
저도 해결하지 못한 비슷한 문제가 있었습니다(PHPUnit에 대한 정보는 의외로 적습니다).제 경우, 각 테스트를 기존의 입력과 기존의 출력으로 분리했습니다.만능 모의 오브젝트를 만들 필요가 없다는 것을 깨달았습니다.특정 테스트에는 특정 오브젝트만 필요했기 때문에 테스트를 분리하여 개별 유닛으로서 코드의 각 측면을 테스트할 수 있었습니다.이것이 당신에게 적용될 수 있을지는 모르겠지만, 그것은 당신이 테스트해야 할 것에 달려 있습니다.
$this->BusinessMock = $this->createMock('AppBundle\Entity\Business');
public function testBusiness()
{
/*
onConcecutiveCalls : Whether you want that the Stub returns differents values when it will be called .
*/
$this->BusinessMock ->method('getEmployees')
->will($this->onConsecutiveCalls(
$this->returnArgument(0),
$this->returnValue('employee')
)
);
// first call
$this->assertInstanceOf( //$this->returnArgument(0),
'argument',
$this->BusinessMock->getEmployees()
);
// second call
$this->assertEquals('employee',$this->BusinessMock->getEmployees())
//$this->returnValue('employee'),
}
시도:
->with($this->equalTo('one'),$this->equalTo('two))->will($this->returnValue('return value'));
언급URL : https://stackoverflow.com/questions/277914/how-can-i-get-phpunit-mockobjects-to-return-different-values-based-on-a-paramete
'programing' 카테고리의 다른 글
Oracle - TO_CHAR로 변환할 때 선두 0이 사라지는 이유는 무엇입니까? (0) | 2023.03.15 |
---|---|
Post name permalink HTTP 404 (0) | 2023.03.15 |
PHP의 HTTP_HOST와 SERVER_NAME의 차이점은 무엇입니까? (0) | 2023.02.01 |
인스턴스의 클래스 이름 가져오기 (0) | 2023.02.01 |
JSON 키가 존재하는지 확인하는 방법 (0) | 2023.02.01 |