codememo

PHPUunit: 여러 인수를 사용하여 여러 메서드 호출을 모의하려면 어떻게 해야 합니까?

tipmemo 2023. 8. 16. 22:25
반응형

PHPUunit: 여러 인수를 사용하여 여러 메서드 호출을 모의하려면 어떻게 해야 합니까?

저는 PHPUunit을 이용한 방법에 대한 단위 테스트를 작성하고 있습니다.내가 테스트하는 방법은 동일한 개체에 대해 동일한 방법을 세 번 호출하지만 다른 인수 집합을 사용합니다.제 질문은 여기서 여기서 하는 질문과 비슷합니다.

다른 게시물에 올라온 질문들은 하나의 주장만을 취하는 조롱 방법과 관련이 있습니다.

그러나 내 방법은 여러 인수를 사용하므로 다음과 같은 것이 필요합니다.

$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()하나의 인수만 유효성을 검사합니다.두 개 이상의 인수를 지정하면 예외가 발생합니다.

PHPUnit_Framework_Constraint_IsEqual의 인수 #2::__syslog는 숫자여야 합니다.

할 수 있는 방법이 있습니까?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()제가 시도한 변종들.

입력 매개 변수를 일치시키고 여러 통화에 대한 반환 값을 제공하려는 다른 사용자.이것은 나에게 효과가 있습니다.

    $mock->method('myMockedMethod')
         ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])
         ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);

맵에서 값을 반환하는 메서드 호출 스텁

$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'));

입력 인수를 지정할 필요가 없는 경우

누군가가 phpunit 문서의 해당 섹션을 보지 않고 이것을 발견한 경우, 당신은 withConsecutive 방법을 사용할 수 있습니다.

$mock->expects($this->exactly(3))
     ->method('MyMockedMethod')
     ->withConsecutive(
         [$arg1, $arg2, $arg3....$argNb],
         [arg1b, $arg2b, $arg3b....$argNb],
         [$arg1c, $arg2c, $arg3c....$argNc]
         ...
     );

유일한 단점은 코드가 제공된 인수 순서대로 MyMockedMethod를 호출해야 한다는 것입니다.나는 아직 이것을 피할 방법을 찾지 못했습니다.

언급URL : https://stackoverflow.com/questions/10954107/phpunit-how-do-i-mock-multiple-method-calls-with-multiple-arguments

반응형