在某些情况下如何告诉mock调用原始方法?

Ash*_*ary 6 php phpunit mocking stub

我有一个类想要在稍后的测试中进行模拟:

class Original {
  function calculate($a) { ... }
}
Run Code Online (Sandbox Code Playgroud)

测试中:

$mock = $this->getMock('Original',['calculate']);
$mock->expcets($this->any())
     ->will($this->returnValueMap([ 
      [1,'ABC'],
      [2,'BCD']
      // somehow tell $mock to call the original calculate() here
);
Run Code Online (Sandbox Code Playgroud)

我想告诉在某些条件$mock下回退到原始版本calculate(),例如,如果参数与任何提供的检查不匹配。据我从阅读 PhpUnit 代码中了解到,如果未找到匹配项,调用程序将返回 null :-?

Sak*_*kis 6

$mock = $this->getMockBuilder(Original::class)
            ->setMethodsExcept(['calculate'])->disableOriginalConstructor()
            ->getMock();
Run Code Online (Sandbox Code Playgroud)

无论如何,这都会调用原始的计算函数。


Ste*_*ott 3

模拟的要点是不调用原始版本,因为它具有您无法控制测试的依赖项。当您想要实际测试calculate()函数时,请调用测试并使用带有设置参数的普通代码来获得您想要的响应。

class Original {
  function calculate($a) { ... }
}

$mock = $this->getMock('Original',['calculate']);
$mock->expects($this->any())
     ->will($this->returnValueMap([ 
        [1,'ABC'],
        [2,'BCD']

$Orig = new Original();
$this->assertEquals(4, $Orig->calculates('2 * 2');
Run Code Online (Sandbox Code Playgroud)