2010-07-14 102 views
33

有時候在我的代碼,我會檢查,看是否有特定的對象實現的接口:PHPUnit的,嘲笑的接口,和的instanceof

if ($instance instanceof Interface) {}; 

然而,PHPUnit中創建上述接口的嘲笑,我不能似乎通過了這個測試。

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

據我所知,擁有一個名爲Interface的類與實現Interface的類不同,但我不確定如何處理這個問題。我不得不模擬一個實現Interface的具體類嗎?這不會破壞使用可移植界面的目的嗎?

感謝

回答

38

這個工作對我來說:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

也許這是一個錯字或也許$實例不是你想它是什麼?

+12

是的,冷卻器頭爲準。經過一整晚睡眠之後,我意識到我在嘲笑對象時並未使用完全限定的命名空間。 – 2010-07-15 13:53:03

+0

略有不同的用例,但我可以檢查一個實例是類的實例還是類的模擬實例。 – kapad 2013-08-24 21:51:23

+0

@kapad您會發現,這是多態性的主要觀點,您不必知道當前對象是否爲class或mock的實例。如果你仍然需要知道,那麼你做錯了什麼。 P.S.只是FYI你可以使用[get_class](http://ca1.php.net/manual/en/function.get-class.php)函數來知道對象的確切類名 – dVaffection 2013-10-02 22:47:48

47

還有assertInstanceOf如3.5.0

例:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_這是推薦的類型檢查方法。 – stefgosselin 2011-05-20 09:07:47

+1

除了@stefgosselin答案,這是推薦的類型檢查方式,因爲你變得更好,自我解釋錯誤消息。比較'''失敗斷言該對象是Class'''的實例'''失敗asserting false' true'''。 – 2015-02-10 19:51:02

+2

從PHP 5.5開始,您可以使用'\ Models \ User :: class'而不是'\ Models \ User'',這使得重構變得容易很多。 – 2017-01-09 10:08:54