2011-04-26 64 views
15

我想模擬我正在測試的同一類中的方法。模擬正在測試的同一類中的方法

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

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

我在想,我可以使用反射來做到這一點,但也許這只是我應該搬到hardToTest到另一個對象的標誌。

+0

我使用PHPUnit的5.7,我需要使用'createPartialMock'並指定哪些方法需要被嘲笑。 – Ryan 2017-07-14 18:11:02

+0

我同意不得不嘲諷被測試的同一個類中的方法是代碼異味,並且該方法應該移入另一個類中。 – 2018-01-16 22:16:59

回答

15

如果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']) 
      ->ge‌​tMock(); 
+2

實際上它應該是''mock = $ this-> getMock('ClassA',['hardToTest']);' 'getMock'的第二個參數應該是一個方法名稱的數組。 – 2014-07-11 09:38:48

+0

在某些情況下,您需要執行部分模擬,例如,如果某個類方法發出HTTP請求。嘲笑該方法並返回請求的存根將是一件好事。 – b01 2016-06-28 16:00:22

+0

現在getMock已經被棄用了,我們該怎麼做呢? – julestruong 2017-02-08 13:11:28

1

究竟什麼方法很難測試?

如果該方法被保護,那麼您可以擴展您的ClassA並使hardToTest($arg)公開。

底線是你不應該只修改這個類,因爲你需要爲它編寫unittest。

+1

我需要測試調用另一種方法在同一類中的方法。我希望能夠在運行時模擬該方法的功能。將該方法移入另一個類不是我的首選選項。 – james 2011-04-26 20:00:37

+1

有點像這樣:http://codepad.viper-7.com/v3SA0s – 2011-04-26 20:01:39

+0

是的,這是非常接近的想法....創建一個被測試的系統的子類和存根我不想要的相關方法測試。謝謝你的幫助 – james 2011-04-26 20:03:32

0

我採取的措施是創建一個我的系統的子類與測試相關的方法被剔除。

相關問題