2012-11-06 10 views
7

मेरे पास मेरे ऐप और मोंगो डेटाबेस के बीच एक सेवा परत है।मैं मोंगोडीबी सेवा परत का परीक्षण करने के लिए moq का उपयोग कैसे करूं?

मैं moq का उपयोग कर एक यूनिट परीक्षण बनाने की कोशिश कर रहा हूं, मैं moq के लिए काफी नया हूं इसलिए मैंने जो सोचा था, उसके साथ मैंने शुरू किया था।

परीक्षण करने के लिए कोड:

public List<BsonDocument> GetAllSettings() 
    { 
     var collection = MongoDatabase.GetCollection<BsonDocument>("Settings"); 
     var query = from e in collection.AsQueryable() 
        select e; 

     var settings = query.ToList(); 
     return settings; 
    } 

कहाँ:

[Test()] 
    public void GetAllSettingsTest() 
    { 
     //Arrange 
     BsonDocument doc01 = new BsonDocument(); 
     BsonDocument doc02 = new BsonDocument(); 

     var mongoDatabase = new Mock<MongoDatabase>(); 
     var collection = new Mock<MongoCollection<BsonDocument>>(); 
     mongoDatabase.Setup(f => f.GetCollection(MongoCollection.Settings)).Returns(collection.Object); 
     collection.Object.Insert(doc01); 
     collection.Object.Insert(doc02); 

     ILogger logger = new Logger(); 
     DatabaseClient.DatabaseClient target = new DatabaseClient.DatabaseClient(logger); 
     target.MongoDatabase = mongoDatabase.Object; 

     MongoCursor<BsonDocument> cursor = collection.Object.FindAllAs<BsonDocument>(); 

     List<BsonDocument> expected = cursor.ToList(); 
     List<BsonDocument> actual; 

     //Act 
     actual = target.GetAllSettings(); 

     //Assert 
     Assert.AreEqual(expected, actual); 
    } 

मैं: सेटिंग एक संग्रह है MongoDatabase एक MongoDBDriver.MongoDatabase

मैं अपने परीक्षण के रूप में इस की कोशिश की है है मुझे "पैरामीटर रहित कन्स्ट्रक्टर नहीं मिला" की त्रुटि मिल रही है:

mongoDatabase.Setup (f => f.GetCollection (MongoCollections.Settings))। रिटर्न (संग्रह। ऑब्जेक्ट);

त्रुटि MongoCollection ऑब्जेक्ट को संदर्भित करती है। मुझे नहीं लगता था कि यह एक कन्स्ट्रक्टर था।

मेरे परीक्षण को चलाने के लिए मैं क्या कर सकता हूं?

+0

डोनॉट मॉक, 'var संग्रह = नया मॉक <मोंगोकोलेक्शन >();' और –

+1

आज़माएं, मुझे खेद है, मैं समझ नहीं पा रहा हूं कि आप क्या सुझाव दे रहे हैं। – Richard210363

उत्तर

3

मैं MongoDbDriver.MongoDatabase से परिचित नहीं हूं, लेकिन अगर ऐसा लगता है जैसे ऐसा लगता है कि यह करता है, तो आप इसे सीधे नकल नहीं कर सकते। आपको मोंगोडीबी एक्सेस कोड को अमूर्त करने की आवश्यकता है, और उस पर नकल करें। यह एक वास्तविक इकाई परीक्षण होगा। जैसे

public interface IMongoDBRepository 
{ 
    Collection<T> GetCollection<T>(string name) where T BsonDocument; 
} 

public class MongoDbRepository : IMongoDBRepository 
{ 
    public Collection<T> GetCollection<T>(string name) 
    where T : BsonDocument 
    { 
     return MongoDatabase.GetCollection<BsonDocument>(name); 
    } 
} 

अब, अपने कोड में, आप एक IMongoDBRepository इंजेक्षन (जो भी डि विधि आप की तरह उपयोग करते हुए) और अपने कोड कुछ इस तरह दिखता होगा:

private IMongoDBRepository _mongoDBRepository; //this gets injected 
public List<BsonDocument> GetAllSettings() 
{ 
    var collection = _mongoDBRepository.GetCollection<BsonDocument>("Settings"); 
    var query = from e in collection.AsQueryable() 
       select e; 

    var settings = query.ToList(); 
    return settings; 
} 

और अंत में अपने इकाई परीक्षण:

[Test()] 
public void GetAllSettingsTest() 
{ 
    //Arrange 
    BsonDocument doc01 = new BsonDocument(); 
    BsonDocument doc02 = new BsonDocument(); 

    var mongoDatabase = new Mock<IMongoDBRepository>(); 
    var collection = new Mock<MongoCollection<BsonDocument>>(); 
    mongoDatabase.Setup(f => f.GetCollection(MongoCollection.Settings)).Returns(collection.Object); 
    collection.Object.Insert(doc01); 
    collection.Object.Insert(doc02); 

    //rest of test 
} 
+0

इसने मुझे कुछ सामान देने के लिए दिया है लेकिन यह काम नहीं करेगा। आप विधि में IMongoDBRepository ऑब्जेक्ट इंजेक्ट नहीं कर सकते हैं। कोड को एक मोंगोडेटाबेस का उपयोग एक IMongoDBRepository नहीं करना चाहिए क्योंकि इसे चलते समय वास्तविक डेटाबेस पढ़ना चाहिए। – Richard210363

+0

इसके अलावा, MongoDatabase.GetCollection (नाम); GetCollection एक स्थिर विधि नहीं है के रूप में नहीं किया जा सकता है। मैं मूल विचार का उपयोग करूंगा और देख सकता हूं कि मैं इसे कार्य करने के लिए प्राप्त कर सकता हूं या नहीं। – Richard210363

7

इस सवाल का सबसे शायद से संबंधित है: How do I mock MongoDB objects to test my data models?

वैसे भी, उसके जब MongoDriver परिवर्तन के आंतरिक कामकाज के किसी भी ई, कम से कम Moq वैसे भी

 var message = string.Empty; 

     var serverSettings = new MongoServerSettings() 
     { 
      GuidRepresentation = MongoDB.Bson.GuidRepresentation.Standard, 
      ReadEncoding = new UTF8Encoding(), 
      ReadPreference = new ReadPreference(), 
      WriteConcern = new WriteConcern(), 
      WriteEncoding = new UTF8Encoding() 
     }; 

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

     var databaseSettings = new MongoDatabaseSettings() 
     { 
      GuidRepresentation = MongoDB.Bson.GuidRepresentation.Standard, 
      ReadEncoding = new UTF8Encoding(), 
      ReadPreference = new ReadPreference(), 
      WriteConcern = new WriteConcern(), 
      WriteEncoding = new UTF8Encoding() 
     }; 

     var database = new Mock<MongoDatabase>(server.Object, "test", databaseSettings); 
     database.Setup(db => db.Settings).Returns(databaseSettings); 
     database.Setup(db => db.IsCollectionNameValid(It.IsAny<string>(), out message)).Returns(true); 

     var mockedCollection = collection.Object; 

नकली करने के लिए आवश्यक विन्यास है के रूप में मैं जुड़ा हुआ प्रश्न में उल्लेख किया है, यह उपयोगी नहीं हो सकता है।

+0

'संग्रह' के लिए कोड कहां है? – zsong

+2

गायब होने लगता है ... 'var संग्रह = नया मॉक > (डेटाबेस.ऑब्जेक्ट," COLLECTIONNAME ", संग्रह सेटिंग); और कुछ उचित संग्रह सेटिंग। –

+0

क्या आप मोंगोडीबी चालक परिवर्तन के आंतरिक काम से आपका मतलब बता सकते हैं? क्या आप सी # मोंगोडीबी चालक के नए संस्करण में अपग्रेड करते समय एपीआई सी # मोंगोडीबी चालक में परिवर्तन का मतलब है? –

संबंधित मुद्दे