[英]Mocking a visitor object using Moq
我编写了一段代码来负责创建问题,它使用访客模式来设置问题受让人。 这是代码:
public Issue CreateIssue(IssueType type, string subject, string description, Priority priority, string ownerId)
{
var issue = new Issue
{
...
};
IssueManagerContext.Current.IssueAssignmentMethodResolver(type).Visit(issue);
...
return issue;
}
我想测试这段代码的功能,因此我需要以某种方式模拟访问者的行为。 在研究了不同的Mock库之后,我决定使用Moq 。 但是我不知道应该如何构建一个从我的代码中获取参数的模拟对象,而不是像快速入门指南中所示那样对其进行硬编码。
到目前为止,这是我所做的:
var visitor = new Mock<IIssueVisitor>();
visitor.Setup(x => x.Visit(null));
如果测试与SUT具有相同的引用,则只能匹配对象的特定实例。 您的方案中的问题是您的SUT创建实例issue
,并在方法末尾将其返回。 方法执行时 ,您的测试无法访问它,从而使模拟对象无法匹配它。
您可以使用以下语法配置模拟对象以匹配任何 Issue
实例:
visitor.Setup(x => x.Visit(It.IsAny<Issue>()));
您还可以将模拟配置为有条件地匹配Issue
实例:
// Matches any instance of Issue that has an ID of 42
visitor.Setup(x => x.Visit(It.Is<Issue>(theIssue => theIssue.ID == 42)));
如果要匹配特定 Issue
实例的引用,则必须将实例化逻辑移到某种抽象(例如工厂)中,您的测试可能会提供伪造的实现。 例如:
// In SUT
var issue = issueFactory.CreateIssue();
...
// In test
var stubIssue = new Issue{ ... };
var issueFactory = new Mock<IIssueFactory>();
var visitor = new Mock<IIssueVisitor>();
...
issueFactory.Setup(factory => factory.CreateIssue())
.Returns(stubIssue);
visitor.Setup(x => x.Visit(stubIssue));
使用以下语法:
interface IFoo
{
int Bar(string baz);
}
var mock = new Mock<IFoo>();
mock.Setup(x => x.Bar(It.IsAny<string>()))
.Returns((string baz) => 42 /* Here baz contains the value your code provided */);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.