4

我为单元测试创​​建了一个自定义 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 可能更有意义?我还有其他选择吗?

4

2 回答 2

5

为了使自定义 Assert 方法的操作与标准断言方法完全相同,您必须抛出一个新的AssertFailedException. 起初我真的不喜欢这样,因为调试器在AssertFailedExceptionthrow 语句上停止,而不是在实际的 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)));
    }
}
于 2013-04-02T12:16:38.300 回答
2

只需从您的自定义标准中调用一个标准Assert

于 2013-03-29T23:54:45.663 回答