[英]Mongodb unit testing in .NET
我想做tdd並使用mongodb作為數據庫。 但我無法解決嘲弄mongodb的問題。 有沒有能力在.NET中模擬mongodb進行單元測試?
更新
我找到了很好的閱讀博客。 你可以在這里找到它:
您應該在MongoDB 之上模擬一個層,而不是模擬MongoDB。
您可能需要考慮一個接口,該接口公開存儲庫上與底層數據存儲無關的操作。 例如,您可能需要一個抽象出類型Student
類型操作的接口,如下所示:
public interface IStudentOperations
{
void Add(Student student);
}
當您創建其他依賴項時,您將注入上述接口的實例,或者您選擇的更高級別的抽象。
關鍵是,不要直接暴露MongoDB。
一旦你這樣做,你可以模擬你想要創建的接口,有一個實現用於測試模擬實現,然后是一個實際的實現與它自己的測試,以驗證實現的操作是正確的,當底層實現是MongoDB的。
盡管可以模擬MongoDB的大多數類(因為這些方法都是virtual
) ,但您可以獲得持久性不可知的好處; 如果你想切換到說,CouchDB或elasticsearch,你不必更改對這些接口的調用,你只需創建一個新的實現。
因為您正在嘗試測試存儲庫的實現,所以通常很好,如前所述,MongoDB的大部分功能都是virtual
,這對大多數virtual
庫都很友好。
也就是說,您必須確保將MongoDatabase
傳遞到存儲庫(而不是在存儲庫中創建它),以便在單元測試中,您可以創建相應的模擬,然后將其傳遞到存儲庫實現中進行測試。
您需要一個存儲庫/ DAL層來隱藏實現細節。 像這樣的東西:
public interface IDataContext<T>
{
// Query
IList<T> GetAll<T>();
IList<T> GetByCriteria<T>(Query query);
T GetByID<T>(string id);
// CUD
void Add(T item);
void Delete(T item);
void Save(T item);
}
模擬添加/刪除/保存看起來很簡單,而有趣的部分是查詢功能。 幸運的是,由於mongo C#驅動程序支持LINQ表達式,我們可以使用LINQ作為查詢語言,而不是重新發明輪子。
例如,生產代碼可能如下所示:
// collection is a MongoCollection<T> object
var items = collection.AsQueryable().Where(...linq expression...);
和單元測試代碼(如果你使用Shim,MS測試):
using (ShimsContext.Create())
{
ShimLinqExtensionMethods.AsQueryableOf1MongoCollectionOfM0(
(MongoCollection<T> x) => Fake_DB_Collection.AsQueryable());
// After this, the above "collection.AsQueryable()" will be mocked as
// an in-memory collection, which can be any subclass of IEnumerable<T>
}
看到這個類似的問題: 在node.js中模擬數據庫?
簡而言之,模仿MongoDB不是正確的方法。 模擬存儲庫足以測試您自己的單元,但如果您想確保正確使用它,或者依賴於唯一性約束等,您仍需要對MongoDB進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.