簡體   English   中英

.NET中的Mongodb單元測試

[英]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);
}
  • 對於生產代碼,在C#驅動程序的幫助下實現具有mongo db操作的接口
  • 對於單元測試代碼,使用內存中集合模擬接口

模擬添加/刪除/保存看起來很簡單,而有趣的部分是查詢功能。 幸運的是,由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM