您好,我有几个测试类,它们使用与OneTimeSetUp
和OneTimeTearDown
IEmbeddable
相同的资源。
假设我有N
个测试类,我想在其中重用OneTimeSetUp
,OneTimeSetDown
和一个资源(一个接口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();
}
}
如何在所有测试类中插入最后一个类?它可以是静态的,也可以不是静态的,只能是一个实例。
答案 0 :(得分:1)
OneTimeSetUp
可以在各个级别上运行。在TestFixture
上,它为灯具运行一次。在SetUpFixture上,它为名称空间运行一次。这给您几个选择...
所有灯具都继承自EmbeddedController
。但是,OneTimeSetUp
随后将为每个灯具运行一次。尽管可以进行测试并且只初始化服务器一次,但是您将无法知道 last 测试何时运行,因此无法进行处理。我的结论是,这对您的情况不起作用,尽管对没有资源且不需要处理的任何事物都有效。
将需要EmbeddedController
的所有灯具放入同一个名称空间,而无需任何其他类。将EmbeddedController
放入相同的名称空间,并使其成为SetUpFixture
。 OneTimeSetUp
将在所有固定装置之前运行一次,而OneTimeTearDown
将在所有固定装置完成之后运行一次。为了使固定装置访问服务器,您应该将Server
设为EmbeddedController
的静态属性。