我想在我正在测试的同一个类中模拟一个方法。
ClassA {
function hardToTest($arg) {
// difficult to test code
}
function underTest() {
return $this->hardToTest('foo');
}
}
我在想我可以使用反射来做到这一点,但也许这只是我应该将hardToTest
移动到另一个对象的一个标志。
答案 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'])
->getMock();
答案 1 :(得分:1)
究竟什么方法很难测试的原因究竟是什么?
如果该方法受到保护,那么您只需扩展您的ClassA并公开hardToTest( $arg )
。
最重要的是,你不应该只修改类,因为你需要为它编写unittest。
答案 2 :(得分:0)
我使用的是创建一个受测试系统的子类,并使用相关方法。