将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);
}
是什么原因?
答案 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);
}