Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用静态类的两个单元测试c#之间的冲突_C#_Unit Testing_Conflict - Fatal编程技术网

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

使用静态类的两个单元测试c#之间的冲突,c#,unit-testing,conflict,C#,Unit Testing,Conflict,我的一些单元测试之间存在冲突。 我有一个带有静态事件的类,当我一次运行一个测试时,我没有问题,但是当我批量运行所有测试时,触发事件的测试将由于注册的侦听器(在以前的测试中已注册到事件)而崩溃 显然,我不希望在测试类触发事件时执行事件处理程序,那么最好的解决方案是什么 我知道如果事件不是静态的,我就不会有问题,但是如果有其他解决方案,我不希望重新设计它 在运行测试之前分离所有事件侦听器可能是一个解决方案,但我认为不可能从类外部进行分离(这似乎很正常,因为我们不希望客户端能够分离所有其他侦听器),从

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

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

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

在运行测试之前分离所有事件侦听器可能是一个解决方案,但我认为不可能从类外部进行分离(这似乎很正常,因为我们不希望客户端能够分离所有其他侦听器),从内部执行这项操作意味着我必须在类中添加一个方法,这只是为了单元测试,这是一种糟糕的做法

是否有一种方法可以在隔离模式下运行测试,从而防止其他以前的测试影响它?比如,如果它是在一个完全分离的进程中运行的,这样我就不会得到对静态事件的相同引用?(但我仍然需要能够通过简单的点击批量执行所有测试)

谢谢你的帮助和想法


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

在每个单独测试中的某个地方,您将自己附加到静态事件。因此,在断言之前只需将自己拆离或更好的在finally块中保护拆离:

[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;
    }
}

你能发一些代码吗?一般来说,应用程序应该清理自身并分离事件处理程序。测试也是如此。好的,所以无论我在哪里附加到一个事件,我都应该在类析构函数中从该事件分离?它可以工作,但问题是侦听静态事件的类也是静态的,我可以显式地调用静态类析构函数吗?好的,但事件处理程序是从类内部附加到方法中的,我没有将其附加到测试方法中,所以我不能在测试方法中分离它。@JonathanBolduc:也许该类应该有一个
Dispose()
方法(或者更好地实现
IDisposable
),在这里它将自己从事件中分离出来。然后你可以在测试中调用
Dispose()
方法来分离它。@Olivier:是的,这正是我解决问题的方法,谢谢@乔纳森:提醒:如果答案有帮助,你应该投票表决。和/或如果它解决了您的问题,您应该接受它。;-)