Как мне смоделировать объекты MongoDB для тестирования моих моделей данных? - PullRequest
6 голосов
/ 01 августа 2011

Я использую следующую логику (MOQ) для попытки макетирования объектов драйвера MongoDB csharp:

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, MOQ пытается создать экземпляр моей фиктивной базы данных MongoDatabase, но происходит сбой с исключением с нулевой ссылкой.

Примечание. Я думаю о создании интерфейса IMongoCollection и обертывании MongoCollection в его экземпляре.Тогда я могу просто высмеять это ... Но это похоже на массу ненужной работы.

Ответы [ 3 ]

1 голос
/ 20 марта 2013

это, вероятно, больше не актуально (и 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 может быть лучше всего подойдет.

1 голос
/ 05 февраля 2014

Вы можете попробовать: https://github.com/razonrus/mongo-infrastructure,, которая призвана стать небольшой библиотекой для имитации объектов коллекции монго в целях тестирования.Репозиторий содержит примеры тестов с фиктивными объектами монго.

Настройка фиктивного объекта в тесте:

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;
1 голос
/ 04 августа 2011

Я закончил тем, что создал свои собственные интерфейсы, которые были в основном поверхностными обертками поверх объектов Mongo.Я могу смоделировать эти интерфейсы и, по крайней мере, проверить, правильные ли индексы и фильтры в моих запросах DAL.

...