gpt4 book ai didi

c# - 返回 IAsyncCursor 的 MongoDB C# 驱动程序 Mock 方法

转载 作者:可可西里 更新时间:2023-11-01 09:11:12 28 4
gpt4 key购买 nike

我正在为使用 mongoDB c# 驱动程序的 DAL 创建一些单元测试。问题是我有这个方法要测试:

    public async virtual Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> predicate)
{
return (await Collection.FindAsync(predicate)).ToList();
}

并使用 Moq我像这样 mock 这个集合:

var mockMongoCollectionAdapter = new Mock<IMongoCollectionAdapter<Entity>>();

var expectedEntities = new List<Entity>
{
mockEntity1.Object,
mockEntity2.Object
};

mockMongoCollectionAdapter.Setup(x => x.FindAsync(It.IsAny<Expression<Func<Entity,bool>>>(), null, default(CancellationToken))).ReturnsAsync(expectedEntities as IAsyncCursor<Entity>);

但是作为expectedEntities as IAsyncCursor<Entity>为 null 则测试无效。

模拟此方法和处理 IAsyncCursor 的最佳方法是什么?

最佳答案

模拟 IAsyncCursor<TDocument> interface 以便可以枚举。反正接口(interface)上的方法不多

var mockCursor = new Mock<IAsyncCursor<Entity>>();
mockCursor.Setup(_ => _.Current).Returns(expectedEntities); //<-- Note the entities here
mockCursor
.SetupSequence(_ => _.MoveNext(It.IsAny<CancellationToken>()))
.Returns(true)
.Returns(false);
mockCursor
.SetupSequence(_ => _.MoveNextAsync(It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(true))
.Returns(Task.FromResult(false));

mockMongoCollectionAdapter
.Setup(x => x.FindAsync(
It.IsAny<Expression<Func<Entity, bool>>>(),
null,
It.IsAny<CancellationToken>()
))
.ReturnsAsync(mockCursor.Object); //<-- return the cursor here.

有关如何枚举游标的引用,请查看此答案。

How is an IAsyncCursor used for iteration with the mongodb c# driver?

在此之后,您将能够理解为什么要为 mock 设置 move next 方法的序列。

关于c# - 返回 IAsyncCursor 的 MongoDB C# 驱动程序 Mock 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176063/

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