首页 > 解决方案 > RavenDB 和 XUnit:每个 TestClass 的多个测试

问题描述

我目前尝试设置一些集成测试,以验证我的 RavenDB 查询是否返回了我期望的结果。

我遵循了文档并启动并运行了一个测试。

当我向同一个类添加额外的测试方法时,问题就开始了。我得到以下异常:

System.InvalidOperationException : Cannot configure server after it was started. Please call 'ConfigureServer' method before any 'GetDocumentStore' is called.

所以基本上它告诉我,服务器已经在运行。但这让我很困惑。因为 XUnit 为该类中每个发现的测试方法创建了一个新的测试类实例。此外,它调用Dispose()任何实现IDisposable. 这是由基类间接实现的RavenTestDriver

所以我认为正在发生的事情:

  1. XUnit 创建我的测试类的新实例
  2. XUnit 调用我的测试方法
  3. 我的测试方法调用ConfigureServer,RavenDB Embedded Server 已启动
  4. 我的测试方法完成
  5. XUnit 调用Dispose我的测试类实例,RavenDB 嵌入式服务器已停止
  6. 冲洗并重复下一个测试方法

但我看起来,我对#5 的假设是错误的。RavenDB 嵌入式服务器似乎从未停止过。此外,我找不到手动停止它的方法。我试图用EmbeddedServer.Instance.Dispose(). 但这不会改变任何事情。(这.Instance给出了一个线索,EmbeddedServer 可能是一个单例,这可能是这里问题的一部分)。

我还尝试将ConfigureServer调用移动到测试类的构造函数中。由于 XUnit 类是每个测试方法的构造函数(就像setupJUnit 中的 -method)。但后来我得到了同样的结果。

但有趣的是:调用ConfigureServer两个不同的类就可以了。

我创建了一个小型复制器存储库

那么有没有人知道如何在一个单元/集成测试环境中设置 RavenDB,你想针对它运行多个测试?

标签: c#integration-testingravendbxunit

解决方案


ConfigureServer从所有测试和构造函数中删除该方法。调用GetDocumentStore()将创建嵌入式服务器。

https://github.com/ravendb/ravendb/blob/e8f08f191e1b085421ca5b4db191b199e7a8fc69/src/Raven.TestDriver/RavenTestDriver.cs#L272

如果要配置服务器,则应将其设置在静态构造函数中:

        static MovieTests_ConfigureInConstructor()
        {
            ConfigureServer(new TestServerOptions() {
                CommandLineArgs = new System.Collections.Generic.List<string> { "--RunInMemory=true", },
                FrameworkVersion = null,
            });
        }

推荐阅读