在Moq中使用Match.Create

时间:2013-01-14 19:55:50

标签: c# moq

Match.Create与Moq一起使用时,我有一种奇怪的行为。

当我将Match.Create作为变量提取时,以下代码段无法通过:

      var mock = new Mock<IA>();
      mock.Object.Method ("muh");
      mock.Verify (m => m.Method (Match.Create<string> (s => s.Length == 3)));

      public interface IA
      {
        void Method (string arg);
      }

是什么原因?

3 个答案:

答案 0 :(得分:5)

谢谢你们两位。但我找到了另一个很好的解决方案。与在描述的quick start中一样,您也可以使用方法。首先,我认为无论是使用变量还是方法都没有区别。但显然Moq足够聪明。所以表达式和谓词的东西可以转换成:

public string StringThreeCharsLong ()
{
  return Match.Create<string> (s => s.Length == 3);
}

我认为这很好,因为它可以减少单元测试中的噪音。

MyMock.Verify (m => m.Method (StringThreeCharsLong());

答案 1 :(得分:4)

你提取的太多了。谓词就足够了:

var mock = new Mock<IA>();
Predicate<string> isThreeCharsLong = s => s.Length == 3;
mock.Object.Method("muh");
mock.Verify(m => m.Method(Match.Create<string>(isThreeCharsLong)));

或者,对于相同的效果但语法略短,您可以使用带有表达式参数的It.Is匹配器:

var mock = new Mock<IA>();
Expression<Func<string, bool>> isThreeCharsLong = s => s.Length == 3;
mock.Object.Method("muh");
mock.Verify(m => m.Method(It.Is<string>(isThreeCharsLong)));

答案 2 :(得分:3)

编辑:再次提出您的问题:

问题是Match.Create<string> (s => s.Length == 3);返回一个字符串。 它只能在.Verify()调用内使用。 It.Is<string>(Expr)也会发生同样的情况,如果你提取一个变量,它将作为一个简单的System.String传递,而验证会将其作为一个值进行检查(并且因为该值只是String.Empty而失败)

var mock = new Mock<IA>();

//this will be a string, and contain just ""
var yourMatcher = Match.Create<string> (s => s.Length == 3);

mock.Object.Method ("muh");

//this will fail because "muh" != ""
mock.Verify (m => m.Method (yourMatcher));

public interface IA
{
  void Method (string arg);
}