如果Assert失败,自定义的Assert类应该执行什么操作?

我创建单元测试自定义断言类,我不知道该怎么做时,我想通知测试失败:如果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更有意义?是否有另一个我失踪的选项?

回答:

为了使自定义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)));

}

}

回答:

只需从自定义内部调用标准Assert即可。

以上是 如果Assert失败,自定义的Assert类应该执行什么操作? 的全部内容, 来源链接: utcz.com/qa/263815.html

回到顶部