繁体   English   中英

如何模拟MongoDB对象来测试我的数据模型?

[英]How do I mock MongoDB objects to test my data models?

我正在使用以下逻辑(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包装在它的实例中。 然后,我可以简单地嘲笑......但这似乎是一大堆不必要的工作。

这可能不再是实际的(并且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上编写包装器可能实际上最合适。

您可以尝试: https//github.com/razonrus/mongo-infrastructure ,其目的是成为一个小型库,用于模拟mongo集合对象以进行测试。 存储库包含使用模拟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;

我最终创建了自己的接口,这些接口基本上是Mongo对象之上的浅包装器。 我可以模拟这些接口,至少测试正确的索引和过滤器在我的DAL查询中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM