2010-08-02 61 views
1

現在這只是奇怪:Lucene的行爲測試

,因爲它是低於與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); 
    } 
+0

當斷言失敗時,原因是什麼?你從Rhino.Mocks獲得什麼? – PatrickSteele 2010-08-03 02:06:50

+0

聲明失敗,因爲沒有結果。我檢查了一下,我仍然找到一位編輯來建立搜索者。 – Khash 2010-08-03 09:22:13

回答

1

我不熟悉Lucene的,但我看到的唯一區別是,通過調用期待,你之前創建IndexSearcher的將文檔添加到作者。在被註釋掉的代碼中,IndexSearcher的創建正在之後您將文檔添加到作者。這是一個重要的區別?

+0

我認爲你是對的。但是我沒有辦法測試這個理論。有沒有辦法使用Func 進行返回,以便在調用模擬時執行代碼? – Khash 2010-08-03 20:13:48

+0

我移動了預期帖子索引,它工作!謝謝。但我仍然很想知道我是否可以使用Func (就像Rhino中的WhenCalled的函數版本) – Khash 2010-08-03 20:21:48

+0

而不是.Return(...)嘗試.WhenCalled(...)。您傳遞給WhenCalled的lambda似乎仍然被調用兩次(一次聲明Expect並再次調用「Get」時)。不知道這是爲什麼,但它應該讓你通過這個障礙。 – PatrickSteele 2010-08-03 20:35:53