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');
我试过为一个特定的方法测试多个参数,并通过相同的模拟为不同的参数得到不同的答案。
这是我目前所做的:
$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');