2010-12-23 26 views
4

假設您正在運行一些單元測試,並且想要了解您正在測試的方法(或腳本或函數或其他)是否會失敗。你如何設置這樣的測試?我希望這樣的事情:當被測試者在Perl中使用TAP失敗時測試預期錯誤是否可行?

ok($obj->method($my, $bad, $params) == DEATH, 'method dies as expected'); 

雖然我不明白怎麼會因爲methoddie■當傳遞壞參數和測試腳本停止工作。

還有別的辦法嗎?

回答

5

你試過Test::Exceptiondies_ok應該做你想做的。例如:

# Check that something died - we do not care why 
dies_ok { $foo->method } 'expecting to die'; 
5

我建議Test::Fatal而非Test::Exception

Test :: Exception已經存在了很長時間,所以很多現有的測試套件都使用它,但Test :: Fatal更容易學習。測試::致命導出只有1個功能:exception。這會運行關聯的代碼並返回它拋出的異常,如果運行沒有錯誤,則返回undef。然後使用is,isnt,likeisa_ok等正常的Test::More函數來測試返回值。

Test :: Exception需要您學習自己的測試功能,如throws_okdies_ok,並且請記住,不要在代碼和測試名稱之間插入逗號。

所以,你的例子是:

use Test::More; 
use Test::Fatal; 

my $obj = ...; 

isnt(exception { $obj->method($my, $bad, $params) }, 
    undef, 'method dies as expected'); 

或者你可以使用like來匹配預期的錯誤消息,或isa_ok來測試它扔了正確的類異常對象。

測試::致命只是比Test :: Exception更少的學習曲線給你更多的靈活性。

1

真的沒有必要使用模塊來做到這一點。你只需換您希望在eval塊失敗,像這樣的電話:

ok !eval {$obj->method($my, $bad, $params); 1}, 'method dies as expected'; 

如果所有在eval順利,它將返回最後執行的語句,在這種情況下1。如果失敗,eval將返回undef。這與ok想要的相反,所以!來翻轉這些值。

然後,您可以按照實際的異常消息的支票,行,如果你想:

like [email protected], qr/invalid argument/, 'method died with invalid argument'; 
+0

的問題,這是有邊界情況可能會非常棘手得到正確和代碼正確處理它們很難在測試中重複。參見[rjbs對Test :: Fatal的解釋](http://advent.rjbs.manxome.org/2010/2010-12-07.html)。 – cjm 2010-12-24 08:19:07

相關問題