如何将IQueryable <t>集合转换为IMongoQueryable <t>?

时间:2017-10-11 14:53:44

标签: c# mongodb mocking

我需要创建一个MongoDB存储库mock。有一种方法可以在我的存储库中返回IMongoQueryable<T>。我不知道如何创建实现此接口的对象。

我真的需要这种方法嘲笑。我看了IMongoQueryable,我看到有一个IQueryable界面,看看:

public interface IMongoQueryable<T> : IMongoQueryable, IQueryable<T>, IAsyncCursorSource<T>

我认为我可以在对象列表上创建一个MongoDB集合,但是我也没有创建它的实例。如果我创建MongoCollection的实例,我可能会调用AsQueryable方法返回IMongoQueryable个对象。

有人有想法这样做吗?

3 个答案:

答案 0 :(得分:2)

当我遇到这个问题时,我只是对Moq进行严格的模拟,然后我继续运行测试模拟方法,直到它停止抛出有关接口的异常。

var mock = new Mock<IMongoQueryable<Foo>>(MockBehavior.Strict);

//add setup here as you run in to exceptions.

var mockInstance = mock.Object;

答案 1 :(得分:2)

你是对的。您需要从名称空间AsQueryable

调用MongoDB.Driver.Linq.

要访问它,请写:

using MongoDB.Driver.Linq; 

如果在同一个文件中使用System.Linq,请务必小心。您将遇到扩展方法冲突。

希望它有所帮助!

答案 2 :(得分:1)

我尝试实施解决方案,但事实并非如此。

var dataQueryable = data.AsQueryable();
        _mongoQueryableMock = new Mock<IMongoQueryable<T>>(MockBehavior.Strict);
        _mongoQueryableMock.Setup(r => r.GetEnumerator()).Returns(data.GetEnumerator());
        _mongoQueryableMock.Setup(r => r.Provider).Returns(dataQueryable.Provider);
        _mongoQueryableMock.Setup(r => r.ElementType).Returns(dataQueryable.ElementType);
        _mongoQueryableMock.Setup(r => r.Expression).Returns(dataQueryable.Expression);

我将我的列表转换为可查询的anf,然后将此列表设置为mock。但是当执行wuery时,没有任何数据。

可能有什么问题