2013-03-29 78 views
4

我創建單元測試自定義斷言類,我不知道該怎麼做時,我想通知測試失敗:如果Assert失敗,自定義的Assert類應該執行什麼操作?

public static class MyAssert 
{ 
    public static void Contains(File file, string text){ 
     if(!ContainText(file, text)){ 
      // what to do here? 
     } 
    } 
} 

我反映Microsoft.VisualStudio.TestTools.UnitTesting.Assert類,並注意到它調用HandleFail:

internal static void HandleFail(string assertionName, string message, params object[] parameters) 
{ 
    string str = string.Empty; 
    if (!string.IsNullOrEmpty(message)) 
    str = parameters != null ? string.Format((IFormatProvider) CultureInfo.CurrentCulture, Assert.ReplaceNulls((object) message), parameters) : Assert.ReplaceNulls((object) message); 
    if (Assert.AssertionFailure != null) 
    Assert.AssertionFailure((object) null, EventArgs.Empty); 
    throw new AssertFailedException((string) FrameworkMessages.AssertionFailed((object) assertionName, (object) str)); 
} 

但是這是一種內部方法。我可以使用反射來調用它,或者拋出一個AssertFailedException更有意義?是否有另一個我失蹤的選項?

回答

5

爲了使自定義Assert方法的操作與標準斷言方法完全相同,您必須拋出一個新的AssertFailedException。起初我真的不喜歡這樣做,因爲調試器在throw語句中停止了,而不是在實際的assert語句中停止。經過多一點研究後,我發現了DebuggerHidden方法屬性和中提琴,我的斷言按要求執行。

[DebuggerHidden] 
public static void Contains(File file, string text){ 
    if(!ContainText(file, text)){ 
     HandleFail("MyAssert.Contains", null, null); 
    } 
} 

[DebuggerHidden] 
private static void HandleFail(string assertName, string message, params object[] parameters) 
{ 
    message = message ?? String.Empty; 
    if (parameters == null) 
    { 
     throw new AssertFailedException(String.Format("{0} failed. {1}", assertName, message)); 
    } 
    else 
    { 
     throw new AssertFailedException(String.Format("{0} failed. {1}", assertName, String.Format(message, parameters))); 
    } 
} 
2

只需從自定義內部調用標準Assert即可。

+0

Assert.Fail是吧?是的,這是有道理的... – Daryl

相關問題