6

编辑

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


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

当试图打开 url http://computername:8080/(由于某种原因 raven db 总是使用我的电脑上的计算机名)时,浏览器加载栏只是旋转,如果我停止单元测试并再次尝试 url 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,如果有区别的话。

4

2 回答 2

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));
    }
}
于 2012-10-12T20:00:07.407 回答
0

他的答案中缺少有关如何应用@Ayende Rahien 解决方案的确切细节,因此我将在此处讲述确切的步骤:

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

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

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

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

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

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

于 2014-06-26T09:00:30.100 回答