PHPUnit如何使用特定参数测试特定方法,并为多个调用提供特定答案

时间:2016-09-20 07:00:56

标签: php phpunit

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

这是我到目前为止所做的:

$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')时,我收到错误

  

断言两个字符串相等无效。   ---期待   +++ Actual @@ @@   -'param1'   + '参数2'

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

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

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

所以问题仍然存在:

如何使用特定方法为不同参数模拟同一个类并获得不同的返回值?

2 个答案:

答案 0 :(得分:1)

您也可以稍微简化这些陈述。如果您需要做的只是模拟函数,那么当您传递'param1'时,您将返回'test1',那么这应该有效:

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

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

答案 1 :(得分:0)

如果它是关于测试类的依赖关系,那么在测试方法中调用两次,那么就可以这样做

$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')调用它,并返回test1,第二次 - 使用arg param2并返回test2