使用匹配.在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足够聪明。因此表达式和谓词的内容可以转换为:
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);
}