我嘗試過使用Moq在使用DetachedCriteria類的存儲庫上單元測試方法。但是我碰到了一個問題,我無法真正模擬內部構建的內部Criteria對象。有什麼辦法模擬分離標準嗎?是否有可能單元測試依賴NHibernate Detached Criteria的方法?
測試方法
[Test]
[Category("UnitTest")]
public void FindByNameSuccessTest()
{
//Mock hibernate here
var sessionMock = new Mock<ISession>();
var sessionManager = new Mock<ISessionManager>();
var queryMock = new Mock<IQuery>();
var criteria = new Mock<ICriteria>();
var sessionIMock = new Mock<NHibernate.Engine.ISessionImplementor>();
var expectedRestriction = new Restriction {Id = 1, Name="Test"};
//Set up expected returns
sessionManager.Setup(m => m.OpenSession()).Returns(sessionMock.Object);
sessionMock.Setup(x => x.GetSessionImplementation()).Returns(sessionIMock.Object);
queryMock.Setup(x => x.UniqueResult<SopRestriction>()).Returns(expectedRestriction);
criteria.Setup(x => x.UniqueResult()).Returns(expectedRestriction);
//Build repository
var rep = new TestRepository(sessionManager.Object);
//Call repostitory here to get list
var returnR = rep.FindByName("Test");
Assert.That(returnR.Id == expectedRestriction.Id);
}
倉儲類
public class TestRepository
{
protected readonly ISessionManager SessionManager;
public virtual ISession Session
{
get { return SessionManager.OpenSession(); }
}
public TestRepository(ISessionManager sessionManager)
{
}
public SopRestriction FindByName(string name)
{
var criteria = DetachedCriteria.For<Restriction>().Add<Restriction>(x => x.Name == name)
return criteria.GetExecutableCriteria(Session).UniqueResult<T>();
}
}
注意我用的 「NHibernate.LambdaExtensions」 和 「Castle.Facilities.NHibernateIntegration」 這裏好。任何幫助將不勝感激。
本質上,我得到返回對象的斷言空引用異常。因此我假定我沒有正確地連接標準。但我不認爲我可以這樣做,因爲標準是在我的資源庫內創建的分離標準的私有字段!
我不是在談觸摸數據庫。我正在測試存儲庫類。確保他們實際上訪問正確的方法。我使用Sqlite單獨映射測試。我想你誤解了我的問題。我嘲笑nhibernate沒有測試實際的數據庫本身。 – 2010-06-11 15:16:53
我同意你的意見,但它不是問題的答案。 – 2010-06-11 15:43:23
但爲什麼模擬出NHibernate?爲什麼不直接打真正的數據庫?你應該小心過度關注如何完成某些事情,這會導致超出規範的測試氣味。你應該擔心的是,當我使用我的存儲庫時,我會得到預期的結果。 – 2010-06-14 18:13:23