Debug.Assert会干扰MSTests,我该如何解决它?

时间:2010-02-02 15:45:20

标签: unit-testing mstest

所以我有一个方法,我通过MSTests进行单元测试,以确保它能够正确地对出现的不良数据进行异常处理。

然而,该方法具有Debug.Assert,因此在调试期间它会被捕获,如果它在实际测试期间发生,我在调试模式中试图找到错误。

因此,单元测试在以这种方式运行时可自动化失败,因为Assert语句出现了Abort,Retry,Ignore。所有3种情况都很重要:

我正在调试并寻找问题,所以我希望Debug.Assert可用。 代码应具有适当的保护子句,因此如果它在生产中发生,则抛出异常。 我的单元测试应该是完全自动化的,无需手动点击即可运行。

有什么工作?

4 个答案:

答案 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)

我刚遇到同样的问题但后来我意识到除非你的代码中有错误,否则不应该出现这种情况。在这种情况下,我真的不介意断言弹出。这是我的推理链:

  1. 只有在不满足函数的前置条件时才会触发Debug.Assert(或者如果函数自身有错误)。
  2. 单元测试应检查功能的发布条件。
  3. 如果函数只满足其所有前提条件,那么它只需要产生它的后置条件,因此没有必要为传递无效前置条件的函数编写单元测试。

答案 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不会干扰自动化测试,如果断言失败,它将失败测试用例,但执行将继续。