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<T>"/> 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);