A.K*_*nov 7 lambda expression moq mocking
我的Repository类中有一个fallowing方法:
public virtual IEnumerable<T> GetAll(Expression<Func<T, bool>> where = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, Expression<Func<T, object>>[] includeProperties = null)
Run Code Online (Sandbox Code Playgroud)
我想问你,当我传递一些具体的lambda表达式时,如何嘲笑它可以返回一些特定的值?
SettingsRepository.Setup(
r =>
r.GetAll(
It.IsAny<Expression<Func<Settings, bool>>>(),
It.IsAny<Func<IQueryable<Settings>, IOrderedQueryable<Settings>>>(),
It.IsAny<Expression<Func<Settings, Object>>[]>())).Returns((Settings[])null);
Run Code Online (Sandbox Code Playgroud)
无论你将使用什么lambda,这都将返回null.
我正在寻找类似的东西:
Expression<Func<Settings, bool>> asdasd = s => s.SubmissionId==1;
SettingsRepository.Setup(
r =>
r.GetAll(
It.Is<Expression<Func<Settings, bool>>>(asdasd),
It.IsAny<Func<IQueryable<Settings>, IOrderedQueryable<Settings>>>(),
It.IsAny<Expression<Func<Settings, Object>>[]>()))
.Returns(() => new[] { new Settings { Submission = ValidSubmission } });
Run Code Online (Sandbox Code Playgroud)
最好的问候,天使
编辑:谢谢你的答案!伊利亚·帕尔金,你说得对!它应该是这样的:
It.Is<Expression<Func<Settings,bool>>>(ex=>ex == null)
Run Code Online (Sandbox Code Playgroud)
"ex"指向表达,我应该作为一个论点传递,对吧?lambda表达式是您预测的类型的委托.现在它正在运作!
SettingsRepository.Setup(
r =>
r.GetAll(
It.Is<Expression<Func<Settings,bool>>>(ex=>ex == null),
It.IsAny<Func<IQueryable<Settings>, IOrderedQueryable<Settings>>>(),
It.IsAny<Expression<Func<Settings, Object>>[]>()))
.Returns(() =>
{
ValidSettings.Submission = ValidSubmission;
return new[] { ValidSettings };
});
SettingsRepository.Setup(
r =>
r.GetAll(
It.Is<Expression<Func<Settings, bool>>>(ex => ex != null),
It.IsAny<Func<IQueryable<Settings>, IOrderedQueryable<Settings>>>(),
It.IsAny<Expression<Func<Settings, Object>>[]>())).Returns(new Settings[0]);
Run Code Online (Sandbox Code Playgroud)
现在,在调用时,该方法将根据使用的参数值返回不同的内容.
我将回到另一个相关问题的主题,今天在我的同事中出现,这里是:
像上面的例子一样,我们有一个存根的SettingsRepository对象;
是否有可能以这种方式设置模拟对象,所以如果你传递一个非常特定的lambda来返回一些预定义的集合,否则为空集合;
例如,如果我说:SettingsRepository.Object.GetAll(x=>x.Id==3,...,...)- >我想获得预定义的集合,如果我说:SettingsRepository.Object.GetAll(x=>x.Id==4,...,...)- >空集合.使用int和string这样的简单类型很容易实现,但是使用表达式?
您可以通过在It.Is()或It.IsAny()方法上传递lambda来控制模拟的反应.
It.Is<Expression<Func<Settings,bool>>>(x=>*what to do with "x"*),"x"指向Expression<Func<...>>现在我必须指定条件,但它应该是什么?
如果我使用int,我会这样做:
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3296 次 |
| 最近记录: |