如果断言失败,自定义断言类应该怎么办?

Dar*_*ryl 4 c# unit-testing vs-unit-testing-framework c#-4.0

我为单元测试创​​建了一个自定义Assert类,当我想通知测试失败时,我不知道该怎么办:

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

我反映了Microsoft.VisualStudio.TestTools.UnitTesting.AssertClass并注意到它调用了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));
}
Run Code Online (Sandbox Code Playgroud)

但这是一种内部方法.我可以使用反射来调用它,或者抛出AssertFailedException更有意义吗?我还缺少另一种选择吗?

Dar*_*ryl 5

为了使自定义Assert方法与标准断言方法完全相同,您必须抛出一个新的AssertFailedException.起初我真的不喜欢这个,因为调试器在AssertFailedExceptionthrow语句上停止,而不是在实际的断言语句上.经过一番研究后,我发现了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)));
    }
}
Run Code Online (Sandbox Code Playgroud)