使用匹配.在Moq中创建

本文关键字:Moq 创建 | 更新日期: 2023-09-27 17:52:54

我有一个奇怪的行为,当使用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);
      }

原因是什么?

使用匹配.在Moq中创建

谢谢你们。但是我找到了另一个很好的解决方法。正如在快速开始中描述的那样,您也可以使用方法。首先,我认为使用变量或方法没有什么区别。但显然Moq足够聪明。因此表达式和谓词的内容可以转换为:

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

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

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

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

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

编辑:你的问题又错了:

问题是Match.Create<string> (s => s.Length == 3);返回一个字符串。它只能在.Verify()调用中使用。It.Is<string>(Expr)也是如此,如果您提取一个变量,它将作为一个简单的System传递。字符串,并且verify将对其作为值进行检查(并且失败,因为该值将只是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);
}