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

标签 unit-testing mstest

所以我有一个通过 MSTests 进行单元测试的方法,以确保它在收到错误数据时正确抛出异常。

但是该方法具有 Debug.Assert,因此如果在我处于 Debug模式试图查找错误的实际测试期间发生这种情况,则在调试时会捕获该方法。

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

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

解决办法是什么?

最佳答案

到目前为止,当单元测试在本地运行时,Nicole 的解决方案并没有达到我想要的效果,因为我故意传递会触发断言的值,以确保抛出异常,从而干扰在本地自动运行单元测试。我想如果我愿意接受 [Conditional("DEBUG")] 就会起作用。编译属性并在 Release模式下运行单元测试。如果我想要这种行为,我可以提供一个带有 [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;
}

关于unit-testing - Debug.Assert 会干扰 MSTests,我该如何解决它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185330/

相关文章:

java - 如何断言此单元测试中已引发 "N"异常?

c# - 无法使用 ConfigurationManager 在 C# .NET Core 单元测试项目中读取 app.config

c# - 使用 Moq 模拟 HttpClient

visual-studio-2019 - VS2019 MSTest 输出被截断,通过 Copy All 获取所有输出的选项不再工作?

java - 如何测试一个方法是否抛出异常junit5

unit-testing - 如何在golang中构建模拟类?

javascript - 应返回的数字是数组中的第一个或最后一个

unit-testing - 如何从命令行运行 JUnit 测试用例

c# - 测试结果中未复制所有程序集 - MS 测试

unit-testing - 在 Team Foundation Server (TFS) 版本上运行单元测试