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

时间:2013-03-29 15:01:02

标签: c# unit-testing c#-4.0 vs-unit-testing-framework

我为单元测试创​​建了一个自定义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更有意义吗?我还缺少另一种选择吗?

2 个答案:

答案 0 :(得分:5)

为了使自定义Assert方法与标准assert方法完全相同,您必须抛出一个新的AssertFailedException。起初我真的不喜欢这个,因为调试器停在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)));
    }
}

答案 1 :(得分:2)

只需在自定义内容中调用标准Assert即可。