Как проверить, был ли вызван метод? - PullRequest
4 голосов
/ 09 ноября 2011

У меня есть класс 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, но Мок говорит, что это не так.

Редактировать

Это ошибка, которую я получаю:

Исключительная ситуация CreateServiceCallsAddTicketComment: Moq.MockException: ожидаемый вызов на макет один раз, но был 0 времена: x => x.AddTicketComment (It.IsAny (), It.IsAny (), It.IsAny ())

Сконфигурированные настройки: x => x.AddTicketComment (It.IsAny (), It.IsAny (), It.IsAny ()), Times.Never Нет выполненные вызовы.

1 Ответ

4 голосов
/ 10 ноября 2011

Когда вы регистрируете блок кода, этот блок кода будет вызываться каждый раз, когда экземпляр Fixture разрешает запрошенный тип. Это означает, что он не заморожен. Если вы хотите что-то заморозить, одну из перегрузок заморозки часто проще использовать.

Еще лучше, поскольку вы, похоже, используете 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 использует внедрение конструктора или свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...