【问题标题】:How can I implement static 'test local' data in an NUnit test?如何在 NUnit 测试中实现静态“测试本地”数据?
【发布时间】:2018-09-15 22:32:53
【问题描述】:

我对一个库有几千个 NUnit 测试,其中许多依赖于一些静态可用的“请求上下文”,这些“请求上下文”的范围仅限于正在服务的请求并跨任务流动。库使用者提供了检索当前请求上下文的实现。

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

最初,我使用TestContext.Current.Properties 实现了这一点,并将我的请求上下文存储在那里,但随着最近的 NUnit 更新,Properties 已变为只读。

是否有任何替代品可以用来实现“测试本地”数据?即在当前测试运行范围内的东西,并且可以静态访问。

【问题讨论】:

    标签: c# nunit nunit-3.0


    【解决方案1】:

    github 上的Similar issue 包含来自 NUnit 开发者的以下声明:

    但是,您不应该更改 NUnit Test,因为 Test 及其派生词是内部的,并且 实施可以改变。内部类允许它,因为 自定义属性可能需要这样做,但我建议测试避免 这样做。

    而且这样的实现变化确实发生了。在 NUnit 2.6.0 之前,TestContextProperties 包,但从 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 这是你的上下文类。 CreateRequestContext() 基本上是一种创建上下文的工厂方法。您可以放置​​创建新上下文实例所需的任何逻辑。

    现在在测试中你可以打电话给ContextAccessor.Current

    [Test]
    public void SomeTest()
    {
        var context1 = ContextAccessor.Current;
        var context2 = ContextAccessor.Current;
    
        Assert.AreSame(context1, context2);
    }
    

    Sample Project on GitHub

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2018-04-23
      • 2013-10-04
      • 1970-01-01
      相关资源
      最近更新 更多