我一直在尋找各種方法來實現與EF的存儲庫模式,特別是使用通用存儲庫。測試假存儲庫
我一直在嘗試使用具有IContext屬性的IRepository,因此IRepository的任何實現之間的唯一區別就是上下文。我發現這非常困難,我已經放棄了「假語境」的方針,現在已經只是名單的字典作爲假庫我的「上下文」:
public Dictionary<Type, object> _sets = new Dictionary<Type, object>();
並對其進行操作,將就在假像這樣:
public void Add<T>(T entity) where T : class
{
var set = _sets[typeof (T)] as IQueryable<T>;
var updatedSet = set.ToList();
updatedSet.Add(entity);
_sets[typeof (T)] = updatedSet.AsQueryable<T>();
}
在真實的版本庫,我可以只使用:
void Add<T>(T entity)
{
Set<T>().Add(entity);
}
在我更新的方法,我就必須有類似的不同的實現方式,以適應一個真正的上下文繼承DbContext,以及一個使用基於集合的方法的僞造。
這種方法讓我很緊張。正如其他人在其他問題中提到的那樣,現在我的存儲庫實現如此不同,以至於我認爲只有在虛擬和真實存儲庫都運行之前,我才能相信測試。
我只是一個小孩,這是超過這個?或者是否有更好的方法來實現更像DbContext的假上下文,所以我不必具有實現存儲庫接口的完全不同的類?
總結:我瞭解使用內存存儲庫進行測試的優點。我的問題是,當我不得不做兩個不同的存儲庫實現時,這是否意味着我做錯了什麼,或者這只是用假貨測試的代價,如果邏輯測試通過,我不應該'那麼多汗?
謝謝。我可能會嘲笑,但我試圖在每一步都弄髒自己的手,所以現在我只是堅持使用虛假內存的方法,以及真實數據的EF上下文。 昨天我正在嘗試你的方法,但它花了我幾個失敗的測試,以實現我無法添加到一個鍵入IQueryable的集合。您的評論確實讓我意識到,我不需要添加一組IQueryable,但是。現在,我只是將該集添加爲一個列表 - 使添加/更新/刪除更清晰,並且我可以使用方法QuerySet將列表返回爲IQueryable,當我需要它在我的測試中進行查詢時。 –
monkeydeus