2017-03-17 75 views
0

我有以下問題:
我想測試控制器,如果在調度過程中沒有發生異常,但控制器使用外部庫,它有自己的phpunit測試。這個庫也使用外部庫與自己的測試等等...模擬PHPUnit中的所有有效方法

所以我的應用程序看起來類似於本圖:

request -> router -> dispatch -> controller -> view

如果在此procces任何錯誤occures。應用程序拋出異常。我想測試控制器,但現在我必須編寫+50行代碼來模擬所需的所有對象。

圖像例如,我從控制器傳遞到view
view我有這樣的事情:

<?php echo $form->openTag('form'); ?> 
    <?php echo $form->openTag('fieldset'); ?> 
     <?php echo $form->label('firstName'); ?> 
     <?php echo $form->input('firstName'); ?> 
     <?php echo $form->errorMessages('firstName'); ?> 
    <?php echo $form->closeTag('fieldset'); ?> 
    <?php echo $form->openTag('fieldset'); ?> 
     <?php echo $form->label('gender'); ?> 
     <?php echo $form->radio('gender'); ?> 
     <?php echo $form->errorMessages('gender'); ?> 
    <?php echo $form->closeTag('gender'); ?> 
    ... 
<?php echo $form->closeTag('form'); ?> 

比方說,我有形式與20個輸入......你明白我的意思?我必須模擬所有可用的方法來通過我的測試。

可以用所有有效的方法來模擬對象嗎?

我的意思是如果有一種方法來模擬類將有所有方法有效?不需要定義任何東西。
如果應用程序需要類A的對象,它將返回類A的對象。
如果應用程序需要陣列將返回陣列
等。

+0

不,這不是嘲笑的作品 - 你的嘲笑不能假設你在運行時給你什麼,而是你必須指示你的嘲笑,並讓它們返回你想要測試的東西那個時間點。 第三方依賴有其自己的單元測試的事實應該給你足夠的覆蓋,儘管...你應該嘲笑這些依賴並且有一系列單元測試,確保你的控制器處理任何依賴可能適當返回的東西。 –

+0

所以,你說我必須編寫+50行代碼才能模擬該窗體的工作正常嗎? – user7686493

回答

0

,我們所知甚少你的應用環境中,但默認情況下$this->createMock(Some::class)會造成整個類的模擬 - 無需嘲笑每一個方法。然後你可以只對某些方法定義行爲,這就是整個嘲諷的重點。所以在你的情況下,我想你會看到你的表單類,你必須將它設置爲視圖。

但我會問你在測試什麼?如果您正在測試表單是否會拋出異常,那麼您不希望嘲笑它,而是執行它並檢查異常。

+0

'......你只能對某些方法定義行爲......,如果我需要定義20或25個方法來使其工作,該怎麼辦?我測試我的請求是否正確調度,但如果元素在視圖中拋出錯誤,我無法測試它 – user7686493

+0

然後,您的代碼需要重新接近,因爲它的寫入方式無法測試@ user7686493 –

+0

@ user7686493您爲什麼要模擬然後表單 - 您希望它被執行而不被模擬並檢查異常。 – ddinchev

相關問題