我如何 Moq IFindFluent 才能使对 ToListAsync 的调用有效?
How do I Moq IFindFluent so this call to ToListAsync works?
我正在对 MongoDB C# 驱动程序的包装器进行单元测试。我有这行代码:
Collection.Find(predicate).ToListAsync();
其中 Collection
是 IMongoCollection<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);
}
我正在对 MongoDB C# 驱动程序的包装器进行单元测试。我有这行代码:
Collection.Find(predicate).ToListAsync();
其中 Collection
是 IMongoCollection<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);
}