在編寫單元測試時,我們總是說我們需要確保代碼始終與外部依賴關係隔離。 Moq之下已被用來提供一個模擬對象,而不是一個有效的流利的nhibernate會話工廠。單元測試 - 從外部依賴關係的隔離
public class and_saving_a_invalid_item_type :
when_working_with_the_item_type_repository
{
private Exception _result;
protected override void Establish_context()
{
base.Establish_context();
_sessionFactory = new Mock<ISessionFactory>();
_session = new Mock<ISession>();
_sessionFactory.Setup(sf => sf.OpenSession()).Returns(_session.Object);
_itemTypeRepository = new ItemTypeRepository(_sessionFactory.Object);
_session.Setup(s => s.Save(null)).Throws(new ArgumentNullException());
}
protected override void Because_of()
{
try
{
_itemTypeRepository.Save(null);
}
catch (Exception ex)
{
_result = ex;
}
}
[Test]
public void then_an_argument_null_exception_should_be_raised()
{
_result.ShouldBeInstanceOfType(typeof(ArgumentNullException));
}
}
實際執行情況如下所示。測試運行良好。但是如果沒有設置拋出argumentnullexception的期望,save方法實際上會返回NullReferenceException。重點是:不是單元測試掩蓋了實際結果。雖然要求是從單元測試的角度來實現的,但它在實施時並未實現。
public class ItemTypeRepository : IItemTypeRepository
{
public int Save(ItemType itemType)
{
int id;
using (var session = _sessionFactory.OpenSession())
{
id = (int) session.Save(itemType);
session.Flush();
}
return id;
}
}
然後,如果最終我們需要編寫集成測試,那麼通過使用模擬框架進行隔離的單元測試的目的是什麼? – arjun
你可以在不嘲笑ISessionFactory的情況下嘲笑版本庫;例如:只是測試邏輯,假裝項目被保存在存儲庫中;這就是集成測試中要測試的內容。請參閱更新。 – henginy