2010-11-21 86 views
7

我正在使用ScalaTest測試一些Scala代碼。 我目前的代碼測試的預期異常喜歡這個如何使用ScalaTest測試預期異常的附加屬性

import org.scalatest._ 
import org.scalatest.matchers.ShouldMatchers 

class ImageComparisonTest extends FeatureSpec with ShouldMatchers{ 

    feature("A test can throw an exception") { 

     scenario("when an exception is throw this is expected"){ 
      evaluating { throw new Exception("message") } should produce [Exception] 
     } 
    } 
} 

但我想例外,例如上添加額外的檢查我想檢查異常消息是否包含某個字符串。

有沒有一種「乾淨」的方式來做到這一點?或者我必須使用try catch塊嗎?

回答

16

我找到了解決辦法

val exception = intercept[SomeException]{ ... code that throws SomeException ... } 
// you can add more assertions based on exception here 
9

你可以做同樣的事情與評估......應產生語法,因爲喜歡攔截,它返回捕獲的異常:

val exception = 
    evaluating { throw new Exception("message") } should produce [Exception] 

然後檢查異常。

+0

它的工作原理和我喜歡t他的語法:它符合函數結果的所有「應該」。 – 2013-09-11 03:21:31

+0

'評估'在2.x中被棄用,並在3.x中被刪除。棄用文檔建議使用'an [Exception] thrownBy'來代替。但是3.0.0-M14返回一個'Assertion':'val ex:Assertion = [Exception] thrownBy {throw new Exception(「boom」)}'。有沒有辦法找回拋出的'Exception'? – kostja 2015-12-21 12:55:01

2

如果你需要進一步檢查預期異常,您可以使用此語法捕捉它:

val thrown = the [SomeException] thrownBy { /* Code that throws SomeException */ } 

該表達式返回捕捉到的異常,這樣就可以進一步檢查它:

thrown.getMessage should equal ("Some message") 

您也可以在一個聲明中捕獲並檢查預期的異常,如下所示:

the [SomeException] thrownBy { 
    // Code that throws SomeException 
} should have message "Some message"