c# - 使用静态类的 2 个单元测试 c# 之间的冲突

标签 c# unit-testing conflict

我的一些单元测试之间存在冲突。 我有一个带有静态事件的类,当我一次运行每个测试时我没有问题,但是当我批量运行所有测试时,触发事件的测试将崩溃,因为注册的监听器(有在之前的测试中注册了事件)。

显然我不希望在被测试的类触发事件时执行事件处理程序,那么最好的解决方案是什么?

我知道如果事件不是静态的,我就不会有问题,但如果有其他解决方案,我宁愿不必重新设计它。

在运行测试之前分离所有事件监听器可能是一个解决方案,但我认为不可能从类之外做到这一点(这似乎很正常,因为我们不希望客户端能够分离所有其他监听器),并从内部进行这意味着我必须在类中添加一个方法,仅用于单元测试,这是一种不好的做法。

有没有办法在隔离模式下运行测试,以防止其他先前的测试对其产生影响?就像它是在一个完全独立的进程中运行的那样,这样我就不会得到对静态事件的相同引用吗? (但我仍然需要能够通过简单的点击批量执行所有测试)

感谢您的帮助和想法!

有关信息,我正在使用 Visual Studio 2012 单元测试框架。

最佳答案

在每个单独的测试中的某个地方,您将把自己附加到静态事件上。所以简单地之前断言简单地分离你自己或更好在finally block 中保护分离:

[TestCase]
public void MyTestDetachingBeforeAssert()
{
    bool finishedCalled = false;
    var eventListener = new EventHandler((sender, e) => finishedCalled = true);

        MyClass.Finished += eventListener;
        // Can lead to detach problems if this throws an exception!
        MyClass.DoSomething();
        MyClass.Finished -= eventListener;

        Assert.That(finishedCalled);
}

[TestCase]
public void MyTestDetachingInFinally()
{
    bool finishedCalled = false;
    var eventListener = new EventHandler((sender, e) => finishedCalled = true);

    try
    {
        MyClass.Finished += eventListener;
        MyClass.DoSomething();

        Assert.That(finishedCalled);
    }
    finally
    {
        MyClass.Finished -= eventListener;
    }
}

关于c# - 使用静态类的 2 个单元测试 c# 之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973081/

相关文章:

c# - "extends itself"确保什么的接口(interface)?

javascript - YUI 测试和 DOM 测试

java - 使用 Spring 4.0.6.RELEASE 使用不同的 *.properties 文件运行我的集成测试

android - nexmo和Google登录之间的冲突

c# - Int32.Parse() 在预期为 0 时返回 0x0001 - 为什么?

c# - 为什么我必须定义一个交换运算符两次?

c# - 要提供哪种参数类型(即 IEnumerable 且具有 Count)?

c# - UnitTest 你如何组织你的测试文件?

jquery - Prototype 和 jquery 插件不能一起工作

conflict - 具有多个起源的亚马逊云前沿分布是否有冲突?