在正在测试的同一个类中模拟一个方法

jam*_*mes 18 php phpunit unit-testing mocking

我想在我正在测试的同一个类中模拟一个方法.

ClassA {
   function hardToTest($arg) {
      // difficult to test code
   }

   function underTest() {
      return $this->hardToTest('foo');
   }
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以用反射来做这件事,但也许这只是我应该hardToTest进入另一个对象的一个标志.

Dav*_*ess 18

如果underTest()传递'foo'给该测试将成功hardToTest().这被称为PHPUnit文档中的部分模拟,因为您只是在嘲笑某些方法.

ClassATest {
    function testUnderTest() {
        $mock = $this->getMock('ClassA', ['hardToTest']);
        $mock->expects($this->once())
             ->method('hardToTest')
             ->with('foo');
        $mock->underTest();
    }
}
Run Code Online (Sandbox Code Playgroud)

我同意你的直觉,这种需要可能是一种代码味道,告诉你这个课程做得太多了.

PHPUnit 5.4+

由于getMock()在5.4中已弃用,请getMockBuilder()改用:

$mock = $this->getMockBuilder('ClassA')
             ->setMethods(['hardToTest'])
             ->ge??tMock();
Run Code Online (Sandbox Code Playgroud)

  • 同意你的是代码味道.每当你必须从同一个类中模拟方法时,是时候考虑将它移动到独立的类中了.它将使您的测试更容易.我遭受了这个. (3认同)
  • 实际上它应该是`$ mock = $ this-> getMock('ClassA',['hardToTest']);``getMock`的第二个参数应该是一个方法名数组. (2认同)