我如何使用Moq IFindFluent来调用ToListAsync?

时间:2015-07-28 01:30:50

标签: c# unit-testing moq mongodb-.net-driver

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

Collection.Find(predicate).ToListAsync();

Collection的类型为IMongoCollection<T>Find(predicate)返回实现IFindFluent<T, T>的实例。我假设ToListAsync()是将结果转换为列表的扩展名。

我正在尝试编写单元测试,我很难处理它。我不能创建一个包装类,因为这就是我正在做的事情。我更愿意这样做ToListAsync()返回一个创建的列表或模拟Find()以返回可以作为列表的东西。

2 个答案:

答案 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);
}