【发布时间】:2015-05-21 15:11:55
【问题描述】:
我正在使用内存数据库为 ServiceStack 编写集成测试,但在尝试同时运行多个测试类时遇到了以下异常:“System.IO.InvalidDataException ServiceStackHost.Instance 已设置”,每个测试类都有自己的 AppHostHttpListenerBase .但是,如果我一次运行一个测试类,它运行并顺利通过。拥有多个类的一个原因是因为我想使用注册的不同服务/依赖项来测试 AppHost,并且还要对我的测试进行逻辑分组。以下是我的测试的一般 sn-p。我希望能够一次运行所有测试。
public class TestClassOne : IDisposable
{
string _endPoint = "http://localhost:54321/";
AppHostHttpListenerBase _appHost;
IDbConnectionFactory _dbConn = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);
public TestClassOne()
{
_appHost = new UnitTestAppHost(_dbConn, ...){};
_appHost.Init().Start(_endPoint);
}
[Fact]
public void Test()
{
...
using(var db = _dbConn.Open())
{
Assert.True(...);
}
}
public void Dispose()
{
_appHost.Dispose();
_appHost = null;
}
}
public class TestClassTwo : IDisposable
{
string _endPoint = "http://localhost:54321/";
AppHostHttpListenerBase _appHost;
IDbConnectionFactory _dbConn = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);
public TestClassTwo()
{
_appHost = new UnitTestAppHost(...){};
_appHost.Init().Start(_endPoint);
}
[Fact]
public void Test()
{
...
using(var db = _dbConn.Open())
{
Assert.True(...);
}
}
public void Dispose()
{
_appHost.Dispose();
_appHost = null;
}
}
我尝试在另一个 AppDomain 上运行,但它似乎不是我想要的,因为我需要在当前运行的 AppDomain (?) 中对 IDbConnection 做一些断言,如果这有任何意义的话.关于我应该如何做的任何建议?顺便说一句,我正在使用 xUnit 和 Resharper 的测试运行器。
【问题讨论】:
-
我没用过,所以可能有点随机,但是你有没有试过改变端点上的端口来进行不同的测试,看看是否有什么不同?
-
是的,在发布这个问题之前尝试过......同样的例外。
-
这有点脏..我再次猜测,但基于错误,ServiceHost 上的静态实例属性是否仍然设置,在您调用 Dispose 之后?如果是这样,您是否尝试在您的
Dispose中将ServiceHost的Instance属性重置为null? setter 是受保护的,但你可能可以从你的 UnitTestAppHost 类中做到这一点,我假设它是从它派生的。 -
刚试过....还是一样的异常。不过感谢您的建议:)
-
您可以配置 Nunit gui 以从不同应用程序域中的不同程序集运行测试。我猜你可能可以对 Resharpers 测试运行器做同样的事情(它甚至可以让你在他们自己的应用程序域中运行不同的测试装置)。将您对不同应用程序主机的测试放入单独的程序集中是一个可行的选择吗?
标签: c# unit-testing servicestack xunit.net