【问题标题】:ServiceStack integration tests: ServiceStackHost.Instance has already been setServiceStack 集成测试:ServiceStackHost.Instance 已设置
【发布时间】: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 中将ServiceHostInstance 属性重置为null? setter 是受保护的,但你可能可以从你的 UnitTestAppHost 类中做到这一点,我假设它是从它派生的。
  • 刚试过....还是一样的异常。不过感谢您的建议:)
  • 您可以配置 Nunit gui 以从不同应用程序域中的不同程序集运行测试。我猜你可能可以对 Resharpers 测试运行器做同样的事情(它甚至可以让你在他们自己的应用程序域中运行不同的测试装置)。将您对不同应用程序主机的测试放入单独的程序集中是一个可行的选择吗?

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


【解决方案1】:

我最终通过创建一个带有公共静态 AppHost 变量的 AppHostSetupFixture 类来解决这个问题。创建一个初始化应用程序主机的 [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();
    }
}

【讨论】:

  • 也可以使用[TestFixtureSetUp]/[TestFixtureTearDown],所以它只在每个测试夹具而不是每个测试中创建/处理一次。
【解决方案2】:

此错误是由于尝试在每个 AppDomain 上运行多个 AppHosts 造成的。每个 ServiceStack AppHost 都是一个单例,每个 AppDomain 只允许一个 AppHost。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多