RavenDB在单元测试期间连接到嵌入式文档存储

时间:2012-10-12 12:24:41

标签: .net ravendb document-database

修改

原来我正在正确存储文档所以这个问题的开头部分不正确,可能是由于我对RavenDB缺乏经验。但是我仍然有一个问题,就是在单元测试中使用EmbeddableDocumentStore时能够打开RavenDB Management Studio。


在使用NUnit进行单元测试期间,我似乎遇到了在EmbeddableDocumentStore中存储文档的问题。为了查看我是否实际存储文档,我正在尝试连接到嵌入式数据库。

当试图打开网址 http:// computername:8080 / (由于某种原因,raven db总是在我的电脑上使用计算机名称)浏览器加载栏只是旋转,如果我停止单元测试并再次尝试网址Chrome只是给我一个无法连接的消息。这是上下文的一些代码。

[TestFixture]
public class Test2 : IDisposable
{
    private EmbeddableDocumentStore _documentStore;

    [SetUp]
    public void SetUp()
    {
        if (_documentStore != null) return;

        _documentStore = new EmbeddableDocumentStore
        {
            DataDirectory = "Data",
            RunInMemory = true,
            UseEmbeddedHttpServer = true
        };

        _documentStore.Configuration.AnonymousUserAccessMode = AnonymousUserAccessMode.All;

        _documentStore.Initialize();
    }

    [Test]
    public void Test()
    {
        var document = StaticData.getdocument();

        using (var session = _documentStore.OpenSession())
        {
            session.Store(document);
            session.SaveChanges();
        }

        using (var session = _documentStore.OpenSession())
        {
            var test = session.Load<ObjectType>().Length;
            //This is always 0
        }
    }

    public void Dispose()
    {
        _documentStore.Dispose();
    }
}

此外,我的测试项目的根目录中有Raven.Studio.xap文件。

我正在使用VS2012和.Net 4.5,如果这有所不同。

2 个答案:

答案 0 :(得分:4)

你走了:

static public void WaitForUserToContinueTheTest(EmbeddableDocumentStore documentStore, bool debug = true)
{
    if (debug && Debugger.IsAttached == false)
        return;

    documentStore.SetStudioConfigToAllowSingleDb();

    documentStore.DatabaseCommands.Put("Pls Delete Me", null,

                                       RavenJObject.FromObject(new { StackTrace = new StackTrace(true) }),
                                       new RavenJObject());

    documentStore.Configuration.AnonymousUserAccessMode = AnonymousUserAccessMode.All;
    using (var server = new HttpServer(documentStore.Configuration, documentStore.DocumentDatabase))
    {
        server.StartListening();
        Process.Start(documentStore.Configuration.ServerUrl); // start the server

        do
        {
            Thread.Sleep(100);
        } while (documentStore.DatabaseCommands.Get("Pls Delete Me") != null && (debug == false || Debugger.IsAttached));
    }
}

答案 1 :(得分:0)

他的回答中没有详细说明如何申请@Ayende Rahien的解决方案,所以我将告诉具体步骤:

  1. 如果您在UseEmbeddedHttpServer设置为true的情况下创建EmbeddableDocumentStore,请将其删除,因为WaitForUserToContinueTheTest会为您创建服务器。

  2. 在要调试的测试代码中,调用WaitForUserToContinueTheTest方法。

  3. 在WaitForUserToContinueTheTest方法之后在Visual Studio中设置断点。

  4. 在调试模式下运行时,应自动打开一个名为localhost:8080 / raven / studio.html或:8080 / raven / studio.html的浏览器窗口。

  5. 要退出WaitForUserToContinueTheTest中的while循环,请使用Raven HTTP GUI并转到“Doc​​uments” - &gt; “所有文件”。在右侧,右键单击“请删除我”行,然后单击“删除”。现在,Visual Studio应继续进行测试。

  6. (顺便说一句,我希望RavenDB团队能够更好地改进单元测试文档。)