ServiceStack集成测试:已经设置了ServiceStackHost.Instance

时间:2015-05-21 15:11:55

标签: c# unit-testing servicestack xunit.net

我正在编写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。

2 个答案:

答案 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。