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

2022-08-30 16:43:45

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

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

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

我在想,我可以用反射来做这件事,但也许这只是一个迹象,表明我应该进入另一个物体。hardToTest


答案 1

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

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'])    // onlyMethods in 8.4+
             ->ge‌​tMock();

答案 2

我采用的是创建受测系统的子类,并删除相关方法。


推荐