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

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

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

我当时以为可以使用反射来做到这一点,但这也许只是我应该将hardToTest移到另一个对象中的信号。

最佳答案

如果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以上版本

由于getMock()在5.4中已弃用,因此请使用getMockBuilder()代替:。
$mock = $this->getMockBuilder('ClassA')
             ->setMethods(['hardToTest'])    // onlyMethods in 8.4+
             ->ge‌​tMock();

10-06 01:32