簡體   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