2010-09-09 83 views
0

我有以下的測試,以驗證我的倉庫被調用它的相應的會話(我已經重寫它突出的實際問題):如何聲明Rhino Mocks調用的通用方法?

[Test] 
    public void Why_Does_This_Fail() 
    { 
     var objectUnderTest = new SomeGenericsProblem(); 

     var fakeSession = MockRepository.GenerateMock<ISession>(); 
     fakeSession.Expect(s => s.Query<SomeClass>()); 

     objectUnderTest.NotWorking<SomeClass>(); 

     fakeSession.AssertWasCalled(t => t.Query<SomeClass>()); 
    } 

但是當我運行測試,我得到這樣的:

System.InvalidOperationException: 無效的調用,最後調用一直使用 或者沒有來電的情況下(讓 確保您調用虛 (C#)/可重寫(VB)方法)(C#)/。 Overridable(VB)方法)。

任何想法我在這裏做錯了嗎?我嘲笑的會話是一個接口,所以它是虛擬/可覆蓋。

我有一種感覺,它與我的查詢方法是一個通用的事實有關,但我不知道任何其他方式來表達我想要測試的東西。

而且,如果我刪除,設置了預期(即這行代碼:)

fakeSession.Expect(s => s.Query<SomeClass>()); 

我得到一個不同的異常這是同樣困惑我的部分:

系統.InvalidOperationException:否 期望被設置爲 驗證,確保方法調用 中的動作是虛擬的(C#)/ 覆蓋(VB.Net)方法calloverridable(VB.Net)方法調用

+0

我在測試中沒有看到任何錯誤。您是否嘗試刪除UnitOfWork並查看它是否有幫助?我想知道是否有你的Repository.Query或uow.Commit方法內的東西,使測試失敗。我將你的測試方法複製粘貼到我自己的項目中,讓ReSharper創建UnitOfWork,Repository和ISession。測試通過確定。我正在使用版本3.5的Rhino Mocs。 – 2010-09-09 16:55:13

+0

@Mikael我必須在那裏有工作單元,因爲如果不是,那麼當我創建存儲庫時,它會拋出無效操作異常(按設計)。我刪除了提交,並得到了同樣的結果。我的repository.Query方法實際上只是調用Session.Query,這就是它的全部功能。 – Joseph 2010-09-09 17:06:56

+0

我剛從頭開始用相同的設計重寫了測試,但是使用了我自己的POCO,它仍然給我帶來了同樣的錯誤。 – Joseph 2010-09-09 18:28:04

回答

2

所以我想通了什麼是錯的。

ISession來自NHibernate,我可能應該提到。

之所以這樣,是cruicialy重要的是,因爲

session.Query<T> 

(這是我試圖嘲弄),是一個拓模型

犀牛嘲笑顯然不是有能力嘲笑擴展方法,因此它爲什麼給我奇怪的錯誤。

所以,我希望能夠拯救別人的時間和痛苦,我試圖弄清楚爲什麼我的測試不會通過。

我已閱讀的唯一解決方案是實際更改擴展方法的設計(我不能這樣做,因爲它是NHibernate的一部分),或者使用不同的模擬框架(如TypeMock)。

0
[Test] 
public void Query_WhenCalled_CallsSessionQuery() 
{ 
     // arrange 
     var session = MockRepository.GenerateStub<ISession>(); 

     var r = new Repository(session); 

     // act 
     r.Query<SomeClass>(); 

     // assert 
     session.AssertWasCalled(s => s.Query<SomeClass>()); 
} 
+0

感謝Jay的想法,但我重寫了這個問題以突出發生了什麼,並完全刪除了使用條款。問題依然存在。 – Joseph 2010-09-09 19:02:38

+0

@Joseph上述作品。請注意,我使用'GenerateStub <>'而不是'GenerateMock <>',並且沒有明確設置期望值,因爲這是不必要的。 – Jay 2010-09-09 19:21:25

+0

再次感謝。我找出了問題所在。查詢函數實際上是一種擴展方法,這就是爲什麼我得到錯誤而你不是。你可能建立自己的ISession接口,而我的是來自NHibernate。 – Joseph 2010-09-09 19:27:20

相關問題