我有一个库的几千个NUnit测试,其中许多都依赖于一些静态可用的请求上下文'它的作用域是服务请求并跨任务流动。库使用者提供了一个实现来检索当前请求上下文。
我需要实现一些东西来为我们的NUnit测试项目提供这个上下文,其中上下文的范围是每个单独的测试运行;每次测试都应该拥有它自己的对象,我应该能够在测试期间从任何地方访问它。
最初,我使用TestContext.Current.Properties
并在那里存储了我的请求上下文,但是在最近的NUnit更新中,Properties
已变为只读。
我是否可以使用任何替代品来测试本地'数据?即可以限定当前测试运行的东西,并且可以静态访问。
答案 0 :(得分:2)
Similar issue包含NUnit开发人员的以下语句:
但是,您并不打算更改某个属性 NUnit测试,因为测试及其衍生物是内部的和 实施可以改变。内部类允许它,因为 自定义属性可能需要这样做,但我建议测试避免 这样做。
这种实施变化实际上已经发生了。在NUnit 2.6.0之前,TestContext
包含Properties
,但自2.6.0以来它已移至TestAdapter
。您仍然可以通过TestContext.CurrentContext.Test.Properties
访问它,但是您无法保证将来不会再次更改。
实现此类上下文访问器的更简洁方法是添加简单的holder,它将当前测试与创建当前上下文实例的测试进行比较。如果这些测试不匹配,则只创建一个新的上下文实例并记住当前的测试。
以下是一份工作样本:
internal static class ContextAccessor
{
private static TestExecutionContext currentRequestTest;
private static RequestContext currentRequestContext;
public static RequestContext Current
{
get
{
var currTest = TestExecutionContext.CurrentContext;
if (currentRequestTest == currTest)
{
return currentRequestContext;
}
currentRequestContext = CreateRequestContext();
currentRequestTest = currTest;
return currentRequestContext;
}
}
public static RequestContext CreateRequestContext()
{
return new RequestContext();
}
}
RequestContext
这是您的上下文类。 CreateRequestContext()
基本上是一个创建上下文的工厂方法。您可以放置创建新上下文实例所需的任何逻辑。
现在在测试中你可以拨打ContextAccessor.Current
:
[Test]
public void SomeTest()
{
var context1 = ContextAccessor.Current;
var context2 = ContextAccessor.Current;
Assert.AreSame(context1, context2);
}