2011-08-01 85 views
4

我使用以下邏輯(MOQ)試圖模擬出MongoDB的CSHARP驅動程序對象:如何模擬MongoDB對象來測試我的數據模型?

var svr = new Mock<MongoServer>(new MongoServerSettings()); 
var db = new Mock<MongoDatabase>(svr.Object, new MongoDatabaseSettings("hf_test", 
new MongoCredentials("hf_test", "hf_pass"), GuidRepresentation.Standard, 
               SafeMode.False, false)); 

當我打電話db.Object,起訂量嘗試創建我的模擬MongoDatabase的一個實例,但它以空引用異常失敗。

注:我正在考慮製作一個IMongoCollection接口,並將MongoCollection封裝在它的一個實例中。然後,我可以簡單地把它嘲笑出來......但是這似乎是一大堆不必要的工作。

+3

我有同樣的問題。總的來說,API似乎不是那種模擬友好的。 –

回答

1

我最終創建了自己的接口,這些接口基本上是在Mongo對象頂部的淺包裝。我可以嘲笑這些接口,並且至少測試適當的索引和過濾器是否在我的DAL查詢中。

+0

你可以試試MongoDB.Dynamic。它只需要接口來堅持和查詢數據,不需要具體的類。 http://www.assembla.com/spaces/mongodb-dynamic/wiki –

1

這可能不再是實際(和API可能已更改爲更模仿了一下友好的),但這裏是它如何能夠(使用MOQ)來完成:這裏

 var message = string.Empty; 
     var server = new Mock<MongoServer>(new MongoServerSettings()); 
     server.Setup(s => s.IsDatabaseNameValid(It.IsAny<string>(), out message)).Returns(true); 

     var database = new Mock<MongoDatabase>(server.Object, "test", new MongoDatabaseSettings() 
     { 
      GuidRepresentation = MongoDB.Bson.GuidRepresentation.Standard, 
      ReadEncoding = new UTF8Encoding(), 
      ReadPreference = new ReadPreference(), 
      WriteConcern = new WriteConcern(), 
      WriteEncoding = new UTF8Encoding() 
     }); 

     var mockedDatabase = database.Object; 

主要問題是,MongoDatabase對象調用方法從MongoServer裏面的構造函數檢查,如果數據庫的名稱符合規則。

的另一個問題是,MongoDatabaseSettings應與所有的值進行初始化(因爲MongoDatabase構造嘗試檢查這些反對要從服務器提供的默認值)。

最大的問題是,這個模擬代碼可能在新版本的C#驅動程序發佈時崩潰:)。因此,在Mongo上編寫包裝可能是最合適的。

0

你可以試試:https://github.com/razonrus/mongo-infrastructure,其目的是爲嘲諷蒙戈集合對象用於測試的小型圖書館。存儲庫包含嘲諷mongo對象的示例測試。

設置模擬對象測試:

var mongoInitializer = new MockMongoWrapper<IMongoInitializer>() 
       .SetupDatabase(x => x.SampleDb, x => x 
        .SetupCollection<User>() 
        .SetupCollection<Article>(
          m => m.Setup(c => c.FindOneById("")).Returns(CreateArticle()))) 
       .SetupDatabase(x => x.LogDb, 
        x => x.SetupCollection<Log>()) 
       .Object;