我使用通用存储库来访问 C# 中的数据,其方法签名是这样的:
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
然后通过以下方式在 MVC 控制器(例如)中使用它
var users = UnitOfWork.UserRepository.Get(
u => u.Id == userId, null, "CreatedEmployer,CreatedEmployer.CreatedByUser");
var checkUser = UnitOfWork.UserRepository.Get(u => u.UserName == email)
.FirstOrDefault();
我希望能够使用 RhinoMocks 模拟这些调用,并根据被调用的表达式接收特定结果。下面的伪代码演示了我想要实现的目标,例如
UnitOfWork.UserRepository.Expect(
u => u.Get(Arg<Expression<Func<User, bool>>>.Matches(u.UserName == "jim")))
.Return(new List<User>() { userJim });
UnitOfWork.UserRepository.Expect(
u => u.Get(Arg<Expression<Func<User, bool>>>.Matches(u.UserName == "jo left ages ago")))
.Return(new List<User>() );
我曾尝试使用 .WhenCalled 但它似乎没有我想要的行为,即在匹配提供的确切提供的表达式时,返回一些特定数据:
.WhenCalled(invocation => {
var predicate = invocation.Arguments.First() as Expression<Func<User, bool>>;
... Do something here
})
我已经在互联网上搜索了一段时间,但还没有找到一个像样的解决方案,大多数解决方案都包括忽略参数,只要你只在一个方法中调用 repo 一次,例如
UserRepository.Expect(u => u.Get()).IgnoreArguments()
.Return(new List<User> { CurrentUser });
这现在被证明是不够的,我需要一些更强大和更具体的东西。我只对第一个论点真正感兴趣。我需要解决上述问题,但如果 RhinoMocks 不存在解决方案,那么我会对任何更容易实现测试表达式的模拟框架感兴趣。