【问题标题】:Moq verifying parameter with multiple boolean conditions具有多个布尔条件的最小起订量验证参数
【发布时间】:2015-11-04 09:51:47
【问题描述】:

我正在努力使我的测试尽可能地具有可读性和可维护性,并且我希望将这种形式的参数对象验证传递给我提供给 SUT 的模拟。

_emailHelperMock.Verify(eh => eh.OnMailCreated(
            It.Is<MailMessage>(WithBodyContaining(enrolment) && SentTo(Test.CustomerAddress))));

但由于出现编译错误,我还没有找到解决方案:

Error   CS0019  Operator '&&' cannot be applied to operands of type 'Expression<Func<MailMessage, bool>>' and 'Expression<Func<MailMessage, bool>>'

我上面使用的语法糖方法是通过以下方式定义的:

    private static Expression<Func<MailMessage, bool>> WithBodyContaining(Enrolment enrolment)
    {
        return mail => mail.Body.Contains(enrolment.Title) && mail.Body.Contains(enrolment.Date);
    }

    private static Expression<Func<MailMessage, bool>> SentTo(string address)
    {
        return mail => mail.To.ToString().Contains(address);
    }

我可以制作一个方法,例如WithBodyContainingEnrolmentAndSentToAddress(enrolment, address),但我宁愿使用上面提到的带有多个布尔检查的表单。

【问题讨论】:

    标签: c# unit-testing tdd moq


    【解决方案1】:

    如果您将方法更改为返回bools 而不是Expression&lt;Func&lt;MailMessage, bool&gt;&gt;s,那么您可以将它们组合起来,我认为它们无论如何都会更清晰。例如:

    _emailHelperMock.Verify(eh => eh.OnMailCreated(It.Is<MailMessage>(mail => WithBodyContaining(mail, enrolment) && SentTo(mail, Test.CustomerAddress)
    
    private static bool WithBodyContaining(MailMessage mail, Enrolment enrolment)
    {
        return mail.Body.Contains(enrolment.Title) && mail.Body.Contains(enrolment.Date);
    }
    
    private static bool SentTo(MailMessage mail, string address)
    {
        return mail.To.ToString().Contains(address);
    }
    

    【讨论】:

      【解决方案2】:

      你必须组合表达式:

      public static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
              {
                  var param = expr1.Parameters[0];
                  if (ReferenceEquals(param, expr2.Parameters[0]))
                  {
                      return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), param);
                  }
                  return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, Expression.Invoke(expr2, param)), param);
              }
      

      【讨论】:

        猜你喜欢
        • 2012-08-09
        • 1970-01-01
        • 2023-03-18
        • 2021-10-19
        • 2011-06-11
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 2016-04-04
        相关资源
        最近更新 更多