所以我有一个方法,我通过MSTests进行单元测试,以确保它能够正确地对出现的不良数据进行异常处理。
然而,该方法具有Debug.Assert,因此在调试期间它会被捕获,如果它在实际测试期间发生,我在调试模式中试图找到错误。
因此,单元测试在以这种方式运行时可自动化失败,因为Assert语句出现了Abort,Retry,Ignore。所有3种情况都很重要:
我正在调试并寻找问题,所以我希望Debug.Assert可用。 代码应具有适当的保护子句,因此如果它在生产中发生,则抛出异常。 我的单元测试应该是完全自动化的,无需手动点击即可运行。
有什么工作?
答案 0 :(得分:2)
到目前为止,当单元测试在本地运行时,Nicole的解决方案没有按照我想要的方式进行,因为我故意传递的值会使Asserts跳闸,以确保抛出异常,干扰在本地自动运行单元测试。我想如果我愿意接受[Conditional("DEBUG")]
编译属性并在发布模式下运行单元测试,它会起作用。如果我想要这种行为,我可以在测试程序集中使用[Conditional("DEBUG")]
提供测试级别(或程序集级别)包装器,但是我可以从预编译的可重用类库中使用它。
这非常接近我想要的,还需要调用Trace.Listeners.Clear();在我的测试套件中。
/// <summary>
/// To suppress UI assert messages use:
/// Trace.Listeners.Clear();
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="assertAgainst"></param>
/// <param name="condition"></param>
/// <param name="exception"></param>
/// <returns></returns>
public static T Assert<T>(this T assertAgainst, Func<T,bool> condition,Func<Exception> exception)
{
var conditionMet = condition(assertAgainst);
if (Debugger.IsAttached)
Debug.Assert(conditionMet);
//assertAgainst.Assert(x => x != null, () => new NullReferenceException());
if (!conditionMet)
throw exception();
return assertAgainst;
}
答案 1 :(得分:1)
我刚遇到同样的问题但后来我意识到除非你的代码中有错误,否则不应该出现这种情况。在这种情况下,我真的不介意断言弹出。这是我的推理链:
答案 2 :(得分:0)
不是直接调用Debug.Assert,而是调用一个包装器方法,在调用Debug.Assert之前检查是否附加了调试器。 (显然,如果没有连接调试器,它应该抛出异常。)例如:
[Conditional("DEBUG")]
public static void Assert(bool condition)
{
if (Debugger.IsAttached)
{
Debug.Assert(condition);
}
else
{
throw new AssertionException();
}
}
答案 3 :(得分:0)
This assert不会干扰自动化测试,如果断言失败,它将失败测试用例,但执行将继续。