繁体   English   中英

使用Moq模拟访问者对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM