2012-10-15 50 views
2

在PHPUnit模擬構建器中是否可以像這樣構建對象(在同一時間實現接口並使用特徵)?同時模擬接口和特徵

<?php 

class FooClassThatD implements BarInterface 
{ 
    use BazTrait; 
} 
+2

您是否閱讀過http://sebastian-bergmann.de/archives/906-Testing-Traits.html以下內容? *「PHPUnit 3.6 [...]支持通過新的'getObjectForTrait()'方法測試特徵,該方法重用模擬對象代碼生成器並返回一個使用被測特徵的類的對象。」* - 那是在2011年1月。那麼你嘗試了什麼,因爲它讓我認爲答案是*是*,我想知道它是否已經是它了。 – hakre

+0

我想實現任何可以讓這個測試通過的東西: '$ foo = $ this-> getMockForTrait('BazTrait') - > ...; $ this-> assertInstanceOf('BarInterface',$ foo);' –

+0

您不需要測試它,PHP本身在編譯時會覆蓋它。你只是在這裏尋找具體的類型,所以我想知道爲什麼甚至需要測試它。如果情況並非如此,請在運行時創建這樣的對象,我在這裏概述了這些內容:[如何在運行時生成或修改PHP類?](http://stackoverflow.com/q/12651179/367456) - 然而,正如所寫,這是非常無用的,因爲你確實地指定了界面,然後測試它。 (編輯,錯誤的鏈接) – hakre

回答

4

我不認爲這是可能的本地模擬對象的方法,因爲它們使用特定的模板來嘲笑一類具有一個特徵,不允許任何擴展點。你可以通過一個測試特定的類來輕鬆解決這個問題,從中可以構建你的模擬。

abstract class BarWithBazTraitTestClass implements BarInterface 
{ 
    use BazTrait; 
} 

爲這個類創建一個模擬,就像其他任何抽象類一樣。

$mock = $this->getMockForAbstractClass('BarWithBazTraitTestClass');