gpt4 book ai didi

c# - 如何模拟 IMongoDatabase

转载 作者:可可西里 更新时间:2023-11-01 10:02:34 27 4
gpt4 key购买 nike

我正在使用 Moq 在 ASP.NET Core 项目中模拟我的对象。

我想模拟以下 IsConnection() 方法:

public Client(IMongoClient client)
{
_client = client;
}

public async Task<bool> IsConectionOk()
{
var pingCommand = new BsonDocument("ping", 1);
var mongoDb = _client.GetDatabase("Name");
var commandResult = await mongoDb.RunCommandAsync<BsonDocument>(pingCommand);
return commandResult != null;
}

如您所见,只有一个注入(inject),IMongoClient,所以我需要模拟这个。现在,我还需要模拟 IMongoDatabase,因为 _client.GetDatabase 返回一个运行 RunCommandAsyncIMongoDatabase/p>

这是我的单元测试:

[Fact]
public async Task IsConnectionOk_xxx_RunPing1Command()
{
var dbMock = new Mock<IMongoDatabase>();
var resultCommand = new BsonDocument("ok", 1);
dbMock.Setup(stub => stub.RunCommandAsync<BsonDocument>(It.IsAny<BsonDocument>(), It.IsAny<ReadPreference>(), It.IsAny<CancellationToken>())).ReturnsAsync(resultCommand);

var mongoClientMock = new Mock<IMongoClient>();
mongoClientMock.Setup(stub => stub.GetDatabase(It.IsAny<string>(), It.IsAny<MongoDatabaseSettings>())).Returns(dbMock.Object);

var client = new Client(mongoClientMock.Object);
var pingCommand = new BsonDocument("ping", 1);

//act
await client.IsConectionOk();

//assert
dbMock.Verify(mock => mock.RunCommandAsync<BsonDocument>( It.Is<BsonDocument>(x => x.Equals(pingCommand)) , It.IsAny<ReadPreference>() ,It.IsAny<CancellationToken>()));
}

你可以看到我模拟了一个 IMongoDatabase 所以我的 mongoClientMock 可以在代码执行时返回它。当代码运行时,我检查过 mongoClientMock.GetDatabase() 正在返回一个 MongoDatabase(直到那里都很好),问题是当MongoDatabaseMock 调用 RunCommandAsync 没有返回我设置的内容,它只返回 null。我不知道我在这里可能会遗漏什么,有什么想法吗?

最佳答案

这里的事情有点棘手。

先介绍一些背景。

根据文档,IMongoDatabase.RunCommandAsync<TResult>定义为

Task<TResult> RunCommandAsync<TResult>(
Command<TResult> command,
ReadPreference readPreference = null,
CancellationToken cancellationToken = null
)

注意 Command<TResult> ,而在您的代码中,您传递了一个 BsonDocument .

幸运的是BsonDocument有一个来自 BsonDocument 的隐式转换运算符至 Command<TResult>

当设置没有得到配置的内容时,它往往会返回 null。因此,您需要确保它的设置正确,以便它执行预期的行为。

[TestClass]
public class UnitTest1 {
[TestMethod]
public async Task _IsConnectionOk_xxx_RunPing1Command() {
var dbMock = new Mock<IMongoDatabase>();
var resultCommand = new BsonDocument("ok", 1);
dbMock
.Setup(stub => stub.RunCommandAsync<BsonDocument>(It.IsAny<Command<BsonDocument>>(), It.IsAny<ReadPreference>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(resultCommand)
.Verifiable();

var mongoClientMock = new Mock<IMongoClient>();
mongoClientMock
.Setup(stub => stub.GetDatabase(It.IsAny<string>(), It.IsAny<MongoDatabaseSettings>()))
.Returns(dbMock.Object);

var client = new Client(mongoClientMock.Object);
var pingCommand = new BsonDocument("ping", 1);

//act
var actual = await client.IsConectionOk();

//assert
Assert.IsTrue(actual);
dbMock.Verify();
}
}

关于c# - 如何模拟 IMongoDatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43940698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com