我如何 Moq IFindFluent 才能使对 ToListAsync 的调用有效?

How do I Moq IFindFluent so this call to ToListAsync works?

我正在对 MongoDB C# 驱动程序的包装器进行单元测试。我有这行代码:

Collection.Find(predicate).ToListAsync();

其中 CollectionIMongoCollection<T> 类型,Find(predicate) return 是实现 IFindFluent<T, T> 的实例。我假设 ToListAsync() 是将结果转换为列表的扩展。

我正在尝试编写单元测试,但我很难处理这个问题。我无法制作包装器 class 因为那是我正在做的事情。我宁愿要么让它成为 ToListAsync() return 一个创建的列表,要么模拟 Find() 到 return 可以成为列表的东西。

我最后为此做了一个小的抽象层,因为我找不到合适的东西并且寻求帮助也没有得到答案。

我创建了一个名为 AppCollection 的 interface/implementation 对,专门用于处理 MongoDB 接口。 IAppCollection 会有 IAppCollection.ToList(predicate) 的方法,AppCollection 会 运行 Collection.Find(predicate).ToListAsync(); 调用,返回列表。后来,模拟 IAppCollection 以确保进行正确的调用是一件微不足道的事情。虽然我无法在本机 LINQ 中测试谓词,但我至少可以编译谓词并将它们与 passing/failing 个对象进行比较。

如果有人难以让它工作,我为模拟 Find() 方法所做的是:

[TestFixture]
class QueryControllerTests
{
    private IOptions<MongoSettings> _mongoSettings;
    private QueryController _queryController;
    private Mock<IFakeMongoCollection> _fakeMongoCollection;
    private Mock<IFindFluent<BsonDocument, BsonDocument>> _fakeCollectionResult;

    [OneTimeSetUp]
    public void Setup()
    {
        _fakeMongoCollection = new Mock<IFakeMongoCollection>();
        _fakeCollectionResult = new Mock<IFindFluent<BsonDocument, BsonDocument>>();

    }
}

其中 IFakeMongoCollection 是:

public interface IFakeMongoCollection : IMongoCollection<BsonDocument>
{
    IFindFluent<BsonDocument, BsonDocument> Find(FilterDefinition<BsonDocument> filter, FindOptions options);
}