我的一个存根模拟对象有一个方法,它将在我想测试的方法中被调用两次。如何编写测试以便我的测试方法中的两个分支都被覆盖?代码示例(存根对象是缓存):
public function myMethodToTest($param, $default) {
if ($this->cache->has($param)) {
return 'A';
} else if ($this->cache->has($default)) {
return 'B';
}
}
答案 0 :(得分:0)
从phpunit documentation解除,我们可以从这个例子开始:
public function testObserversAreUpdated()
{
// Create a mock for the Observer class,
// only mock the update() method.
$observer = $this->getMockBuilder('Observer')
->setMethods(array('update'))
->getMock();
// Set up the expectation for the update() method
// to be called only once and with the string 'something'
// as its parameter.
$observer->expects($this->once())
->method('update')
->with($this->equalTo('something'));
// Create a Subject object and attach the mocked
// Observer object to it.
$subject = new Subject('My subject');
$subject->attach($observer);
// Call the doSomething() method on the $subject object
// which we expect to call the mocked Observer object's
// update() method with the string 'something'.
$subject->doSomething();
}
注意with()
方法调用。您可以使用它来指定使用特定参数值调用方法的期望,并指定在发生时返回的内容。在你的情况下,你应该能够做这样的事情:
$cacheStub->method('has')
->with($this->equalTo('testParam1Value'))
->willReturn(true);
在一次测试中执行此操作,并且您将测试代码的一个分支。在单独的测试中,您可以以不同方式设置模拟:
$cacheStub->method('has')
->with($this->equalTo('testParam2Value'))
->willReturn(true);
此测试将测试您的其他分支。如果您愿意,可以将它们组合成单个测试,您可能必须在断言之间重新创建模拟。
另请参阅this short article,除了with()
$this->equalTo()