【发布时间】:2010-02-25 15:47:45
【问题描述】:
在测试单例类时,我们需要单个实例在每次测试后“消失”。有没有办法配置 nunit 在每次测试后重新创建测试应用程序域,或者至少在每个夹具之后?
【问题讨论】:
-
如果单例的设置太复杂以至于每次调用都需要测试,是否可以将创建逻辑封装到方法中,然后改为测试该方法?
在测试单例类时,我们需要单个实例在每次测试后“消失”。有没有办法配置 nunit 在每次测试后重新创建测试应用程序域,或者至少在每个夹具之后?
【问题讨论】:
您可以在通过条件方法进行测试时提供更新单例实例的方法。
// CUT
public sealed class Singleton{
private static Singleton _instance = new Singleton();
private Singleton()
{
// construct.
}
public static Singleton Instance{
get{
return _instance;
}
}
[Conditional ("DEBUG")]
public static void FreshInstance (){
_instance = new Singleton();
}
}
// NUnit
[TestFixture]
public class SingletonTests{
[SetUp]
public void SetUp(){
Singleton.FreshInstance();
}
}
【讨论】:
我需要做同样的事情,所以我创建了一个库,它基本上接受当前测试并在新的 AppDomain 中重新执行它。这是一个名为 NUnit.ApplicationDomain 的 nuget 包,是 open source。
示例代码:
[Test, RunInApplicationDomain]
public void Method()
{
Console.WriteLine("I'm in a different AppDomain")
}
【讨论】:
我想我在这里遗漏了一些东西,拉尔夫。只是为了我自己的利益,您能否解释一下为什么将具有以下属性的方法添加到您的测试类以删除和重新创建您的实例对您不起作用?
为方法添加这些属性应该使它们在每次测试之前/之后运行。
[SetUp]
[TearDown]
为方法添加这些属性应该使它们在夹具之前/之后运行。
[TestFixtureSetUp]
[TestFixtureTearDown]
使用具有这些属性的方法无法在测试之间创建和销毁您的域,有什么原因吗?
【讨论】: