如何在 NUnit 测试中实现静态 'test local' 数据?
How can I implement static 'test local' data in an NUnit test?
我有一个库的几千个 NUnit 测试,其中许多依赖于一些静态可用的 'request context',这些测试的范围仅限于所服务的请求并跨任务流动。库使用者提供一个实现来检索当前请求上下文。
我需要实施一些东西来为我们的 NUnit 测试项目提供上下文,其中上下文的范围是每个单独的测试 运行;每个测试 运行 应该有它自己的对象,我应该能够在测试期间从任何地方访问它。
最初,我是使用 TestContext.Current.Properties
并将我的请求上下文存储在那里实现的,但是随着最近的 NUnit 更新,Properties
已变为只读。
是否有任何替代品可以用来实现 'test local' 数据?即在当前测试范围内的东西 运行,并且可以静态访问。
Similar issue on github 包含 NUnit 开发人员的以下声明:
However, it's not intended that you should change the properties of an
NUnit Test, because Test and its derivatives are internal and the
implementation can change. The internal classes allow it because
custom attributes may need to do it, but I recommend that tests avoid
doing it.
而且这样的实现变化已经实际发生了。在 NUnit 2.6.0 之前,TestContext
有 Properties
个包,但从 2.6.0 开始它被移动到 TestAdapter
。您仍然可以通过 TestContext.CurrentContext.Test.Properties
访问它,但是您不能保证这不会在将来再次更改。
实现这种上下文访问器的更简洁的方法是添加简单的持有者,它将当前测试与为其创建当前上下文实例的测试进行比较。如果这些测试不匹配,它只会创建一个新的上下文实例并记住当前测试。
这是一个工作示例:
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
这是您的上下文 class。 CreateRequestContext()
基本上是一个创建上下文的工厂方法。您可以放置创建新上下文实例所需的任何逻辑。
现在在测试中你可以调用 ContextAccessor.Current
:
[Test]
public void SomeTest()
{
var context1 = ContextAccessor.Current;
var context2 = ContextAccessor.Current;
Assert.AreSame(context1, context2);
}
我有一个库的几千个 NUnit 测试,其中许多依赖于一些静态可用的 'request context',这些测试的范围仅限于所服务的请求并跨任务流动。库使用者提供一个实现来检索当前请求上下文。
我需要实施一些东西来为我们的 NUnit 测试项目提供上下文,其中上下文的范围是每个单独的测试 运行;每个测试 运行 应该有它自己的对象,我应该能够在测试期间从任何地方访问它。
最初,我是使用 TestContext.Current.Properties
并将我的请求上下文存储在那里实现的,但是随着最近的 NUnit 更新,Properties
已变为只读。
是否有任何替代品可以用来实现 'test local' 数据?即在当前测试范围内的东西 运行,并且可以静态访问。
Similar issue on github 包含 NUnit 开发人员的以下声明:
However, it's not intended that you should change the properties of an NUnit Test, because Test and its derivatives are internal and the implementation can change. The internal classes allow it because custom attributes may need to do it, but I recommend that tests avoid doing it.
而且这样的实现变化已经实际发生了。在 NUnit 2.6.0 之前,TestContext
有 Properties
个包,但从 2.6.0 开始它被移动到 TestAdapter
。您仍然可以通过 TestContext.CurrentContext.Test.Properties
访问它,但是您不能保证这不会在将来再次更改。
实现这种上下文访问器的更简洁的方法是添加简单的持有者,它将当前测试与为其创建当前上下文实例的测试进行比较。如果这些测试不匹配,它只会创建一个新的上下文实例并记住当前测试。
这是一个工作示例:
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
这是您的上下文 class。 CreateRequestContext()
基本上是一个创建上下文的工厂方法。您可以放置创建新上下文实例所需的任何逻辑。
现在在测试中你可以调用 ContextAccessor.Current
:
[Test]
public void SomeTest()
{
var context1 = ContextAccessor.Current;
var context2 = ContextAccessor.Current;
Assert.AreSame(context1, context2);
}