我正在测试MongoDB C#驱动程序的包装器。我有这行代码:
Collection.Find(predicate).ToListAsync();
Collection
的类型为IMongoCollection<T>
,Find(predicate)
返回实现IFindFluent<T, T>
的实例。我假设ToListAsync()
是将结果转换为列表的扩展名。
我正在尝试编写单元测试,我很难处理它。我不能创建一个包装类,因为这就是我正在做的事情。我更愿意这样做ToListAsync()
返回一个创建的列表或模拟Find()
以返回可以作为列表的东西。
答案 0 :(得分:2)
我为此制作了一个小抽象层,因为我找不到合适的东西,并且寻求帮助没有得到任何答案。
我创建了一个名为AppCollection
的接口/实现对,专门用于处理MongoDB接口。 IAppCollection
会有IAppCollection.ToList(predicate)
的方法,AppCollection
会运行Collection.Find(predicate).ToListAsync();
调用,返回列表。之后,嘲笑IAppCollection
以确保正确调用是一件小事。虽然我无法在本机LINQ中测试谓词,但我至少可以编译谓词并将它们与通过/失败的对象进行比较。
答案 1 :(得分:1)
如果任何人都难以使其正常工作,那么我模拟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);
}