我想模擬我正在測試的同一類中的方法。模擬正在測試的同一類中的方法
ClassA {
function hardToTest($arg) {
// difficult to test code
}
function underTest() {
return $this->hardToTest('foo');
}
}
我在想,我可以使用反射來做到這一點,但也許這只是我應該搬到hardToTest
到另一個對象的標誌。
我想模擬我正在測試的同一類中的方法。模擬正在測試的同一類中的方法
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'])
->getMock();
實際上它應該是''mock = $ this-> getMock('ClassA',['hardToTest']);' 'getMock'的第二個參數應該是一個方法名稱的數組。 – 2014-07-11 09:38:48
在某些情況下,您需要執行部分模擬,例如,如果某個類方法發出HTTP請求。嘲笑該方法並返回請求的存根將是一件好事。 – b01 2016-06-28 16:00:22
現在getMock已經被棄用了,我們該怎麼做呢? – julestruong 2017-02-08 13:11:28
究竟什麼方法很難測試?
如果該方法被保護,那麼您可以擴展您的ClassA並使hardToTest($arg)
公開。
底線是你不應該只修改這個類,因爲你需要爲它編寫unittest。
我採取的措施是創建一個我的系統的子類與測試相關的方法被剔除。
我使用PHPUnit的5.7,我需要使用'createPartialMock'並指定哪些方法需要被嘲笑。 – Ryan 2017-07-14 18:11:02
我同意不得不嘲諷被測試的同一個類中的方法是代碼異味,並且該方法應該移入另一個類中。 – 2018-01-16 22:16:59