如何基于方法参数进行模拟

时间:2016-02-03 14:56:45

标签: php phpunit

我的一个存根模拟对象有一个方法,它将在我想测试的方法中被调用两次。如何编写测试以便我的测试方法中的两个分支都被覆盖?代码示例(存根对象是缓存):

public function myMethodToTest($param, $default) {
    if ($this->cache->has($param)) {
         return 'A';
    } else if ($this->cache->has($default)) {
         return 'B';
    }
}

1 个答案:

答案 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()