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