2010-06-09 20 views
4

我對TDD相當陌生,我正在用NUnit和Moq。我有一個方法,我期望有一個例外,所以我想玩一點框架功能。NUnit - ExpectedMessage不同錯誤

我的測試代碼如下:

[Test] 
    [ExpectedException(ExpectedException = typeof(MockException), ExpectedMessage = "Actual differs from expected")] 
    public void Write_MessageLogWithCategoryInfoFail() 
    { 
     string message = "Info Test Message"; 

     Write_MessageLogWithCategory(message, "Info"); 

     _LogTest.Verify(writeMessage => 
      writeMessage.Info("This should fail"), 
      "Actual differs from expected" 
     ); 
    } 

但我一直收到errormessage的是,實際的異常消息從預期的消息不同的錯誤信息。我究竟做錯了什麼?

+1

你正在使用哪個測試跑步者? – Grzenio 2010-06-09 12:02:35

+0

我正確理解你的跳頻,我正在使用NUnit版本2.5.1 – Mark 2010-06-09 13:15:27

+0

,並且您正在使用nunit-gui.exe運行測試?或者你以某種方式從Visual Studio運行它們? – Grzenio 2010-06-09 14:01:01

回答

3

不幸的是,Resharper測試運行器有一個bug /限制 - 它不處理ExpectedException屬性。你有兩個選擇:

  1. 使用一些其他的測試運行(如NUnit的-gui.exe,隨NUnit的) - 但這種做法使得它的痛苦來調試你的測試

  2. 捕捉和驗證例外手動,使用以下模式:

    [測試] 公共無效Write_MessageLogWithCategoryInfoFail() { 嘗試 { 字符串消息= 「信息測試消息」;

    Write_MessageLogWithCategory(message, "Info"); 
    
        _LogTest.Verify(writeMessage => 
         writeMessage.Info("This should fail"), 
         "Actual differs from expected" 
    ); 
        Assert.Fail("Expected exception"); 
    } 
    catch(MockException e) 
    { 
        Assert.AreEqual("Actual differs from expected", e.Message); 
    } 
    

    }

它的一個真正的恥辱,因爲說你期待一個例外是好得多的描述方式!

在一個側面說明,我希望上面的代碼僅用於與框架玩 - 通常你永遠不會趕上MockExceptions :)

+1

謝謝我測試了你的代碼,我想我現在知道它爲什麼永遠不會平等。異常中的消息由於更詳細的錯誤消息而變得更大: 「實際與預期不同\ r \ n未對mock:writeMessage => writeMessage.Info(\」This should fail \「)執行入位」「 但謝謝你的提示!即使這個測試運行在生產代碼上。是的,我正在玩框架;-) – Mark 2010-06-09 15:05:31

+0

運行NUnit測試TestDrivet.Net時出現類似錯誤: 異常消息文本不正確 預期:Password_too_short 但是:Password_too_short編輯:在我的情況下,消息是真的不同(繼續換行後) – GolfWolf 2011-08-23 08:16:10

+0

@ w0lf,你的意思是有一個換行符的結尾處,但不是在你通過TestDriven.NET ? – 2012-02-07 17:07:44

2

您可以使用額外的參數MatchType = MessageMatch.Regex

+2

想想提供更多解釋,您爲什麼認爲這將解決問題。關於如何應用您的解決方案的更多細節,可能是代碼片段將是最好的主意。 – 2012-07-15 19:05:06

+2

MatchType = MessageMatch.Contains也可以。 – Junto 2013-07-17 10:37:50

+0

使用Resharper時,這並不能解決問題。 – 2015-03-18 20:03:10