C# 如何在Moq中模拟链式Linq方法

C# 如何在Moq中模拟链式Linq方法,c#,linq,unit-testing,mocking,moq,C#,Linq,Unit Testing,Mocking,Moq,我有一个疑问 var myRecord = myRepository.All().Any(e => e.Id == id); 我用这个嘲弄它 this._myMockRepository .Setup(s => s.All().Any(It.IsAny<Expression<Func<MyObject, bool>>>())) .Returns(this.GetFakeMyObjects().Any(t => t.Id ==

我有一个疑问

var myRecord = myRepository.All().Any(e => e.Id == id);
我用这个嘲弄它

this._myMockRepository
    .Setup(s => s.All().Any(It.IsAny<Expression<Func<MyObject, bool>>>()))
    .Returns(this.GetFakeMyObjects().Any(t => t.Id == 1));
对于Moq来说是相当新的,所以任何提示都将非常感谢。

,这就是
any
的含义。很难从代码示例中分辨出来,但是如果
All()
不是扩展方法,只需模拟它,然后测试调用的任何方法都返回
Any
的预期结果。如果它也是静态的,那么它可能会在封面下调用
GetEnumerator
,而您可以模拟它

如果您需要更多的指导,您需要发布一些您正在尝试测试的方法(即使用存储库的方法)。

更新 如果
All()

this._myMockRepository
    .Setup(_ => _.All())
    .Returns(this.GetFakeMyObjects());//<-- assuming GetFakeMyObjects returns an enumerable

Moq无法模拟扩展方法。这些都是扩展方法。Moq不模拟扩展方法。您需要模拟的是调用模拟成员时返回的内容,这些成员可以满足提供的linq查询模拟的类型是什么。基于代码片段的假设表明它是可枚举的。使用可用于重现问题并提供更好答案的更新问题。Bayete@Nkosi;)我几乎可以工作了,不幸的是我的T不能转换成IEnumerable。您能否共享GetFakeMyObjects()的实现?@NeilHumby显示被模拟的存储库的定义。我假设它是可枚举的,
All
是一个linq扩展方法。提供所需信息,以便正确更新答案。
this._myMockRepository
    .Setup(_ => _.All())
    .Returns(this.GetFakeMyObjects());//<-- assuming GetFakeMyObjects returns an enumerable
public interface IRepository {
    IEnumerable<MyObject> All();
}
/// <summary>
/// Converts a generic <seealso cref="System.Collections.Generic.IEnumerable&lt;T&gt;"/>  to a <see cref="Moq.Mock"/> implementation of queryable list 
/// </summary>
public static Mock<T> SetupQueryable<T, TItem>(this Mock<T> queryableMock, IEnumerable<TItem> source)
    where T : class, IEnumerable<TItem> {

    var queryableList = source.AsQueryable();

    queryableMock.As<IQueryable<TItem>>().Setup(x => x.Provider).Returns(queryableList.Provider);
    queryableMock.As<IQueryable<TItem>>().Setup(x => x.Expression).Returns(queryableList.Expression);
    queryableMock.As<IQueryable<TItem>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
    queryableMock.As<IQueryable<TItem>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator());

    return queryableMock;
}
var fakeItems = GetFakeMyObjects();
var _myMockRepository = new Mock<IMyRepository>()
_myMockRepository.SetupQueryable(fakeItems);
var myRepository = _myMockRepository.Object;
var myRecord = myRepository.All().Any(e => e.Id == id);