簡體   English   中英

如何驗證調用方法?

[英]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));

根據我的理解,這應該“凍結” ICreateServiceMock<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM