我想在我正在测试的同一类中模拟一个方法。
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+
->getMock();