![](/img/trans.png)
[英]Visual Studio 2012 Fakes - How do I verify a method was called?
[英]How do I verify a method was called?
我有一個ICreateService
類,它依賴於ITicketApiAdapter
。 我已經嘗試注冊一個模擬ITicketAdaper,以便在創建匿名創建服務時注入它。
所以,在設置中,我有這個票證適配器的注冊表:
Fixture.Register(() =>
{
var ticketApiAdapter = new Mock<ITicketApiAdapter>();
ticketApiAdapter
.Setup( x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()))
.Returns(new SaveResult
{
Success = true,
Id = Fixture.CreateAnonymous<Guid>().ToString()
});
return ticketApiAdapter;
});
Fixture.Register(() => new CreateService(Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>().Object));
根據我的理解,這應該“凍結” ICreateService
和Mock<ITicketApiAdapter>
這樣當我請求匿名實例時,它就是我注冊的那個。
我有一個看起來像這樣的測試:
[TestMethod]
public void CreateServiceCallsAddTicketComment()
{
var apiTicketAdapter = Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>();
var createTicketRequest = Fixture.CreateAnonymous<CreateTicketComment>();
var createService = Fixture.CreateAnonymous<CreateService>();
var results = createService.CreateTicketComment(createTicketRequest);
apiTicketAdapter
.Verify(x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()),
Times.Once());
Assert.IsTrue(results.All(x => x.Success));
Assert.IsTrue(results.All(x => x.Errors.Count == 0));
}
我希望apiTicketAdapter是我注冊的那個,以便我可以驗證該方法是否被調用。 如果我單步執行,則會調用TicketApiAdapter,但是Moq說它不是。
這是我得到的錯誤:
CreateServiceCallsAddTicketComment拋出異常:Moq.MockException:模擬一次的預期調用,但是是0次:x => x.AddTicketComment(It.IsAny(),It.IsAny(),It.IsAny())
已配置的設置:x => x.AddTicketComment(It.IsAny(),It.IsAny(),It.IsAny()),Times.Never未執行任何調用。
注冊代碼塊時, 每次 Fixture實例解析所請求的類型時 ,都會調用該代碼塊。 這意味着它沒有被凍結。 如果你想凍結某些東西,其中一個Freeze重載通常更容易使用。
更好的是,既然你似乎在使用Moq,我可以建議使用AutoMoq擴展嗎?
這將使您能夠將測試重寫為以下內容:
[TestMethod]
public void CreateServiceCallsAddTicketComment(new AutoMoqCustomization());
{
var fixture = new Fixture().Customize()
var apiTicketAdapter = fixture.Freeze<Mock<ITicketApiAdapter>>();
ticketApiAdapter
.Setup( x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()))
.Returns(new SaveResult
{
Success = true,
Id = Fixture.CreateAnonymous<Guid>().ToString()
});
var createTicketRequest = fixture.Freeze<CreateTicketComment>();
var createService = fixture.CreateAnonymous<CreateService>();
var results = createService.CreateTicketComment(createTicketRequest);
apiTicketAdapter
.Verify(x => x.AddTicketComment(
It.IsAny<User>(),
It.IsAny<Customer>(),
It.IsAny<TicketComment>()),
Times.Once());
Assert.IsTrue(results.All(x => x.Success));
Assert.IsTrue(results.All(x => x.Errors.Count == 0));
}
這是假設CreateTicketRequest使用構造函數注入或屬性注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.