【问题标题】:Lucene behaviour in mocked unit tests模拟单元测试中的 Lucene 行为
【发布时间】:2010-08-02 22:55:01
【问题描述】:

现在这很奇怪:

下面的代码在带有 RhinoMocks 的 NUnit 单元测试中运行良好(断言通过)。

这是在代码中创建一个 IndexSearcher。 现在,如果我使用 Get 的模拟版本(交换 IndexSearcher 的注释分配),那么现在搜索器由模拟返回,它不会通过断言。

谁能弄清楚这是为什么? (NUnit 2.5.2 - RhinoMocks 3.6 - Lucene 2.9.2)

    [Test]
    public void Test()
    {

        ISearcherManager searcherManager = _repository.StrictMock<ISearcherManager>();
        Directory directory = new RAMDirectory();
        IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), true);

        searcherManager.Expect(item => item.Get()).Return(new IndexSearcher(writer.GetReader())).Repeat.AtLeastOnce();

        _repository.ReplayAll();

        //searcherManager.Get();

        Document doc = new Document();
        doc.Add(new Field("F", "hello you", Field.Store.YES, Field.Index.ANALYZED));
        writer.AddDocument(doc);

        IndexSearcher searcher = searcherManager.Get();
        //IndexSearcher searcher = new IndexSearcher(writer.GetReader());
        QueryParser parser = new QueryParser("F", new StandardAnalyzer());
        Query q = parser.Parse("hello");
        TopDocs hits = searcher.Search(q, 2);

        Assert.AreEqual(1, hits.totalHits);
    }

【问题讨论】:

  • assert 失败,是什么原因?你有从 Rhino.Mocks 得到什么吗?
  • 断言失败,因为没有结果。我查了一下,我仍然有一个作家来构建搜索器。

标签: rhino-mocks lucene.net


【解决方案1】:

我不熟悉 Lucene,但我看到的唯一区别是,通过 Expect 调用,您是在 将文档添加到编写器之前创建 IndexSearcher。在注释掉的代码中,IndexSearcher 的创建发生在您将文档添加到编写器之后。这是一个重要的区别吗?

【讨论】:

  • 我认为你是对的。但是我没有办法测试这个理论。有没有办法使用 Func 进行返回,以便在调用模拟时执行代码?
  • 我移动了 Expectation 帖子索引,它起作用了!谢谢。但是我仍然很想知道我是否可以拥有 Func(就像 Rhino 中的函数版本 WhenCalled)
  • 而不是 .Return(...) 尝试 .WhenCalled(...)。不过,您传递给 WhenCalled 的 lambda 似乎仍然被调用了两次(一次是在声明 Expect 时,另一次是在调用“Get”时)。不知道为什么会这样,但它应该能让你克服这个障碍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2018-09-04
  • 2013-11-12
  • 2018-11-21
  • 2018-10-19
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多