[英]Why does using an non-inlined It.IsAny<T> in Moq not work correctly?
将It.IsAny<T>()
分配It.IsAny<T>()
对象上的Setup
使用的变量不能按预期方式工作:以下所示的测试失败。
但是,如果我内联anyString
变量,则测试将通过。 这里发生了什么?
public class MyService
{
private readonly IDependency _dependency;
public MyService(IDependency dependency)
{
_dependency = dependency;
}
public string UseTheDependency(string input)
{
return _dependency.GetValue(input);
}
}
public interface IDependency
{
string GetValue(string input);
}
public class Tests
{
[Test]
public void TestTheTestClass()
{
var mockDependency = new Mock<IDependency>();
var anyString = It.IsAny<string>();
mockDependency.Setup(x => x.GetValue(anyString)).Returns("expected value");
var service = new MyService(mockDependency.Object);
var result = service.UseTheDependency("something random");
Assert.That(result, Is.EqualTo("expected value"));
}
}
这是因为Setup
方法将Linq表达式( Expression<Func<IDependency, string>>
)作为参数,而不是委托( Func<IDependency, string>
)作为参数。 它使Moq可以检查抽象语法树,以了解正在配置的调用。 如果您使用在表达式外部声明的变量,则Moq不会知道您使用了It.IsAny
,它只会看到一个null
(从技术上讲,它将看到对封装捕获的局部变量的对象的anyString
字段的访问,并且字段仅包含null
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.