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