說我有以下業務邏輯:如何測試的對象得到更新使用假倉庫
foreach (var item in repository.GetAll())
{
if (SomeConditition)
{
item.Status = Status.Completed;
repository.Update(item);
}
}
現在,我寫了下面的單元測試:
public void Test()
{
var repository = new FakeRepository();
repository.Add(new Item());
RunBusinessLogic(repository);
Assert.AreEqual(Status.Completed, repository[0].Status);
}
FakeRepository是一個列表來實現,而GetAll()只是返回列表。
雖然我可以測試使用此方法涉及的大部分邏輯,但我無法驗證是否已記住在業務代碼中調用repository.Update()。由於FakeRepository.GetAll()返回實際對象,因此在調用Update()之前,存儲庫對象將已被業務代碼修改。實際上,FakeRepository.Update()什麼也不做。
我知道我可以使用FakeRepository.Update記錄它已被調用,並在測試中斷言。但是,如果我忘記調用更新,我不能相信要記住更新,對嗎?如果省略了更新調用,我寧願測試簡單失敗。
任何想法?
正如我上面提到的,我還可以用我的假倉庫,以驗證更新是否已被調用。但是當我忘記在業務代碼中調用Update時,即使我不這樣做,我也希望測試失敗。如果我的假存儲庫更實際並且返回副本而不是來自GetAll的真實存儲庫對象引用,那麼測試會正常失敗。因此,使用內存數據庫作爲存儲庫將是解決我的問題的一種方法。但我想知道是否有更簡單的解決方案。 – 2010-09-24 11:43:04