如何实施静态测试本地' NUnit测试中的数据?

时间:2018-04-06 00:43:43

标签: c# nunit nunit-3.0

我有一个库的几千个NUnit测试,其中许多都依赖于一些静态可用的请求上下文'它的作用域是服务请求并跨任务流动。库使用者提供了一个实现来检索当前请求上下文。

我需要实现一些东西来为我们的NUnit测试项目提供这个上下文,其中上下文的范围是每个单独的测试运行;每次测试都应该拥有它自己的对象,我应该能够在测试期间从任何地方访问它。

最初,我使用TestContext.Current.Properties并在那里存储了我的请求上下文,但是在最近的NUnit更新中,Properties已变为只读。

我是否可以使用任何替代品来测试本地'数据?即可以限定当前测试运行的东西,并且可以静态访问。

1 个答案:

答案 0 :(得分:2)

github上的

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

Sample Project on GitHub