如何从外部类运行OneTimeSetUp和OneTimeTearDown

时间:2018-09-28 13:20:35

标签: unit-testing .net-core nunit

您好,我有几个测试类,它们使用与OneTimeSetUpOneTimeTearDown IEmbeddable相同的资源。

假设我有N个测试类,我想在其中重用OneTimeSetUpOneTimeSetDown和一个资源(一个接口IEmbeddedable)。如何创建一个可以被所有测试类重用的静态类EmbeddableController

基本上我想:

-Start static Resource of type `IEmbeddedable` once
-Run TestClass 1 on resource ( set it up +tear it down)
-Run TestClass 2 on resource (set it up + tear it down)
......
-Run TestClass N on resource (set it up +tear it down)

可嵌入

interface IEmbeddedable:IDisposable {
        int ExposedPort { get; }
    }

Test_ClassX

class Test_ClassX {
            private IEmbeddedable server;
            [OneTimeSetUp]
            public  void Launch() {
                server = RedisServer.Launch();
            }
            [OneTimeTearDown]
            public void Stop() {
                this.server.Dispose();
            }

            [TestCase()]
            public async Task CanRunEmbeddedServer() {

                using (server) {
                    var multi = new Multiplexer();
                    using (var link = multi.OpenLink(Address.Create(Port:server.ExposedPort))) {
                        string rez=await link.FlushAllAsync();
                        Assert.AreEqual(rez, "OK");
                    }


                }
            }
}

原型

 static class EmbeddedController {
        private static  IEmbeddedable server;
        [OneTimeSetUp]
        public static void Run() {
            server = RedisServer.Launch();
        }
        public static void Stop() {
            server.Dispose();
        }
    }

如何在所有测试类中插入最后一个类?它可以是静态的,也可以不是静态的,只能是一个实例。

1 个答案:

答案 0 :(得分:1)

OneTimeSetUp可以在各个级别上运行。在TestFixture上,它为灯具运行一次。在SetUpFixture上,它为名称空间运行一次。这给您几个选择...

  1. 所有灯具都继承自EmbeddedController。但是,OneTimeSetUp随后将为每个灯具运行一次。尽管可以进行测试并且只初始化服务器一次,但是您将无法知道 last 测试何时运行,因此无法进行处理。我的结论是,这对您的情况不起作用,尽管对没有资源且不需要处理的任何事物都有效。

  2. 将需要EmbeddedController的所有灯具放入同一个名称空间,而无需任何其他类。将EmbeddedController放入相同的名称空间,并使其成为SetUpFixtureOneTimeSetUp将在所有固定装置之前运行一次,而OneTimeTearDown将在所有固定装置完成之后运行一次。为了使固定装置访问服务器,您应该将Server设为EmbeddedController的静态属性。