我已经尝试为特定方法测试多个参数,并通过相同的模拟为不同的参数获得不同的答案。
这是我到目前为止所做的:
$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'));
我不知道为什么这需要,也许我错了。
所以问题仍然存在:
如何使用特定方法为不同参数模拟同一个类并获得不同的返回值?
答案 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
。