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

时间:2011-04-26 19:44:12

标签: php unit-testing mocking phpunit

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

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

   function underTest() {
      return $this->hardToTest('foo');
   }
}

我在想我可以使用反射来做到这一点,但也许这只是我应该将hardToTest移动到另一个对象的一个​​标志。

3 个答案:

答案 0 :(得分:16)

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

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

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

PHPUnit 5.4 +

由于在{5.4}中弃用getMock(),因此请改为使用getMockBuilder()

$mock = $this->getMockBuilder('ClassA')
             ->setMethods(['hardToTest'])
             ->ge‌​tMock();

答案 1 :(得分:1)

究竟什么方法很难测试的原因究竟是什么?

如果该方法受到保护,那么您只需扩展您的ClassA并公开hardToTest( $arg )

最重要的是,你不应该只修改类,因为你需要为它编写unittest。

答案 2 :(得分:0)

我使用的是创建一个受测试系统的子类,并使用相关方法。