我是新來的NHibernate,甚至更新的版本來MOQ(或其他類似的框架)。在日夜搜索(谷歌+ stackoverflow +其他)後,我正在尋求幫助。起訂量NHibernate的ISession.Get不叫模仿會話對象
的情況是(應該是)簡單。我想單元測試一個使用NHibernate作爲ORM層的C#WCF服務的調用。該方法在完成一些初始工作後,找到要連接的數據庫,然後調用SessionProvider(會話工廠的管理器)爲分片數據庫返回nhibernate會話。然後我嘗試使用ISession.Get <>()從數據庫中檢索一個對象,然後做一些工作。問題在於GUID(我在db中查找的條目的關鍵)是在調用開始時生成的,我無法知道它可能在WCF調用的範圍之外。因此,我不能使用sqllite或其他技術來預先填充必要的數據來控制測試。我所希望的是,我可以以某種方式模擬(注入一個虛假的層?)對Session.Get的調用,以返回一個無效的對象,這將導致WCF調用拋出。
這裏的測試代碼片段:
var testRequest = ... (request DTO)
var dummyBadObject = ... (entity in DB)
var mock = new Mock<ISession>(MockBehavior.Strict);
mock.Setup(m => m.Get<SampleObject>(It.IsAny<Guid>())).Returns(dummyBadObject);
var exception = Assert.Throws<FaultException>(() => applicationService.SomeMethod(testRequest));
Assert.AreEqual(exception.Code.ToString(), SystemErrorFault.Code.ToString());
當我運行,而不是與模擬的Isession對象交互本次測試,應用服務代碼調用實際的Isession對象的獲取從會話工廠,可連接到數據庫並獲得正確的對象。似乎我錯過了一些非常基本的關於模擬或注入的東西。任何幫助將不勝感激。
感謝, 肖恩
你已經設置了一個模擬的ISession。但你在SessionProvider中註冊的地方在哪裏? – 2013-05-11 22:45:05
SessionProvider是應用程序服務程序集的一部分,它在初始化時初始化靜態會話提供程序,然後創建會話工廠高速緩存以按需提供會話。因此,我無法直接註冊模擬會話,而無需在爲我執行內部工作的應用程序服務上創建測試方法。我希望Moq能夠爲ISession做一個「全局」攔截,然後發出模擬會話。現在,這是我對Moq做什麼的理解完全錯誤的地方。也許微軟的假貨可能是合適的? – Shawn 2013-05-12 02:33:42