使用Moq,如何使用lambda参数模拟方法

时间:2013-10-14 14:46:40

标签: lambda mocking expression moq

我的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)

我想问你,当我传递一些具体的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);

无论你将使用什么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 } });

祝你好运, 天使

编辑: 谢谢你的答案!伊利亚·帕尔金,你说得对!它应该是这样的:

It.Is<Expression<Func<Settings,bool>>>(ex=>ex == null)

“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]);

现在,在调用时,该方法将根据使用的参数值返回不同的内容。


我将回到另一个相关问题的主题,今天在我的同事中出现,现在是:

  • 与上面的例子一样,我们有一个存根的SettingsRepository对象;

  • 是否可以通过这种方式设置模拟对象,因此如果您传递一个非常特定的lambda来返回一些预定义的集合,否则为空集合;

e.g。如果我说:SettingsRepository.Object.GetAll(x=>x.Id==3,...,...) - &gt;我想获得预定义的集合,如果我说:SettingsRepository.Object.GetAll(x=>x.Id==4,...,...) - &gt;空集合。使用简单类型(如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);

0 个答案:

没有答案