ebb*_*ebb 4 c# unit-testing mocking
我有一个通用存储库,正在尝试将.Returns转换为表达式,但是它拒绝...我的代码如下:
public RepositoryTest()
{
IList<MockObjectSet> mocks = new List<MockObjectSet>()
{
new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 },
new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 }
};
var mockRepository = new Mock<IRepository<MockObjectSet>>();
mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
.Returns((Expression<Func<MockObjectSet, bool>> predicate) => mocks.Where(predicate).ToList());
}
Run Code Online (Sandbox Code Playgroud)
只是说
Delegate System.Func<System.Collections.Generic.IEnumerable<expWEBCRM.Tests.Repositories.MockObjectSet>> does not take 1 arguments
提前致谢!
您需要Returns像这样明确地指定重载的类型参数:
mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
.Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList());
Run Code Online (Sandbox Code Playgroud)
编辑存储库采用一个表达式并将其用于IQueryable。模拟数据源实际上是一个IEnumerable。LINQ接口的区别是一个lambda,一个是表达式:
IQueryable<T>.Where(Expression<Func<T,bool>>);
IEnumerable<T>.Where(Func<T,bool>);
Run Code Online (Sandbox Code Playgroud)
会发生什么事在这种情况下试图调用IEnumerable.Where带Expression<Func<T,bool>>。解决此问题的最简单方法是将源集合设为IQueryable:
public RepositoryTest()
{
IQueryable<MockObjectSet> mocks = new List<MockObjectSet>()
{
new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 },
new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 }
}.AsQueryable();
var mockRepository = new Mock<IRepository<MockObjectSet>>();
mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
.Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4104 次 |
| 最近记录: |