我目前尝试设置一些集成测试,以验证我的RavenDB查询返回我所期望的。
我按照文档做了一个单独的测试并运行。
问题开始时,我添加一个额外的测试方法到同一类。我得到以下异常:
System.InvalidOperationException : Cannot configure server after it was started. Please call 'ConfigureServer' method before any 'GetDocumentStore' is called.
基本上它告诉我,服务器已经在运行。但这让我很困惑。因为XUnit为该类中每个发现的测试方法创建一个测试类的新实例。此外,它在实现IDisposable
的任何实例上调用Dispose()
。由基类RavenTestDriver
间接实现。
所以我认为发生了什么:
- XUnit创建一个测试类的新实例
- XUnit调用测试方法
- 我的测试方法调用
ConfigureServer
, RavenDB嵌入式服务器启动 - 我的测试方法完成
- XUnit在我的测试类实例上调用
Dispose
, RavenDB嵌入式服务器被停止 - 对齐并重复下一个测试方法
但是看起来,我对#5的假设是错误的。RavenDB嵌入式服务器似乎永远不会停止。另外,我找不到一种方法来手动停止它。我试图用EmbeddedServer.Instance.Dispose()
手动处理它。但这改变不了什么。(.Instance
给出了一个线索,EmbeddedServer可能是一个单例,这可能是这里的问题的一部分)。
我还尝试将ConfigureServer
调用移动到测试类的构造函数中。因为XUnit类为每个测试方法提供了构造函数(就像JUnit中的setup
方法一样)。但是我得到了相同的结果。
但有趣的部分是:在两个不同的类中调用ConfigureServer
很好。
我已经创建了一个小的复制器存储库。
所以有没有人知道如何在单元/集成测试环境中设置RavenDB,你想对它运行多个测试?
从所有测试中删除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,
});
}