我正在编写ServiceStack与内存数据库的集成测试,我遇到了这个异常:“System.IO.InvalidDataException ServiceStackHost.Instance已经设置”,同时尝试一起运行多个测试类,每个测试类都有自己的AppHostHttpListenerBase 。但是,如果我一次运行一个测试类,它会运行并且没有问题。拥有多个类的一个原因是因为我想测试注册了不同服务/依赖项的AppHost,并且还要逻辑地对我的测试进行分组。以下是我测试的一般摘要。我希望能够一次性完成所有测试。
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做一些Asserts,如果这有任何意义的话。关于我应该如何做的任何建议?我正在使用xUnit和Resharper的测试运行器btw。
答案 0 :(得分:1)
我最后通过使用公共静态AppHost变量创建AppHostSetupFixture类来解决此问题。创建一个初始化app主机的[SetUp]方法和一个处理它的[TearDown]方法。在测试类中使用AppHostSetupFixture.AppHost。
[SetUpFixture]
public class AppHostSetupFixture
{
public static ServiceStackHost AppHost;
[SetUp]
public void Setup()
{
AppHost = new BasicAppHost(typeof(FeatureService).Assembly)
{
ConfigureContainer = container =>
{
var l = new List<string>();
l.Add(ConfigurationManager.ConnectionStrings["Redis"].ConnectionString);
container.Register<IRedisClientsManager>(c => new RedisManagerPool(l, new RedisPoolConfig() { MaxPoolSize = 40 }));
}
}
.Init();
}
[TearDown]
public void TearDown()
{
AppHost.Dispose();
}
}
答案 1 :(得分:0)
此错误是尝试为每个AppDomain运行多个AppHost的结果。每个ServiceStack AppHost都是一个单独的,每个AppDomain只允许一个AppHost。