PHPUnit如何测试具有特定参数的特定方法以及多个调用的特定答案

PHPUnit how to test a specific method with specific parameter with specific answer for more than one call

我试过为一个特定的方法测试多个参数,并通过相同的模拟为不同的参数得到不同的答案。

这是我目前所做的:

$mock = $this->getMockBuilder('MyClass')->disableOriginalConstructor()->getMock();

$mock->expects($this->any())
            ->method('myMethod')
            ->with($this->equalTo('param1'))
            ->will($this->returnValue('test1'));
$mock->expects($this->any())
            ->method('myMethod')
            ->with($this->equalTo('param2'))
            ->will($this->returnValue('test2'));

当我调用 $myClass->myMethod('param1') 时一切正常,我得到 'test1'

但是,问题来了:

当我调用 $myClass->myMethod('param2') 时出现错误

Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'param1' +'param2'

我找到的解决方案是为每次调用创建一个新的模拟。

$mock1 = $this->getMockBuilder('MyClass')->disableOriginalConstructor()->getMock();        
$mock1->expects($this->any())
    ->method('myMethod')
    ->with($this->equalTo('param1'))
    ->will($this->returnValue('test1'));

$mock2 = $this->getMockBuilder('MyClass')->disableOriginalConstructor()->getMock();
$mock2->expects($this->any())
    ->method('myMethod')
    ->with($this->equalTo('param2'))
    ->will($this->returnValue('test2'));

我不知道为什么需要这个,也许我用错了。

所以问题仍然存在:

如何使用特定方法针对不同的参数模拟相同的 class 并获得不同的 return 值?

如果它是关于一个被测试的 class 的依赖关系,它在被测试的方法中被调用两次,那么它可以像这样

$mock = $this->getMockBuilder('MyClass')->disableOriginalConstructor()->getMock();

$mock->expects($this->at(0))
            ->method('myMethod')
            ->with($this->equalTo('param1'))
            ->will($this->returnValue('test1'));
$mock->expects($this->at(1))
            ->method('myMethod')
            ->with($this->equalTo('param2'))
            ->will($this->returnValue('test2'));

第一次必须使用 arg param1 调用,然后 $mock->myMethod('param1') 将 return test1,第二次 - 使用 arg param2 并将 return test2.

您还可以稍微简化这些语句。如果您需要做的只是模拟该函数,以便在您通过 'param1' 时返回 'test1',那么这应该有效:

$mock->method('myMethod')
    ->with('param1')
    ->willReturn('test1');

$mock->method('myMethod')
    ->with('param2')
    ->willReturn('test2');