Moq (. NET Core) - Mock.Verify не идентифицирует вызов, сделанный для имитации сервиса, предоставляемого IServiceProvider. - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь написать интеграционный тест для метода обслуживания. Тест компилируется и выполняется без ошибок, но в нем говорится, что количество вызовов, соответствующих предикату, равно 0.

Настройка теста:

            [TestCase]
            public void Save_Submission_Processing_And_ClientGroupMapping_Type()
            {
                Mock<ISubmissionRepository> submissionRepositoryMock = new Mock<ISubmissionRepository>();

                submissionRepositoryMock.Setup(x => x.GetOne(It.IsAny<Guid>())).Returns(QueryResult<Submission>.Ok(new Submission()));


                IServiceCollection services = new ServiceCollection();
                services.AddSingleton(x => submissionRepositoryMock.Object);


                ClientGroupMappingService clientGroupMappingService = new ClientGroupMappingService(services.BuildServiceProvider());

                clientGroupMappingService.ProcessClientGroupMappingImport(Guid.NewGuid());

                submissionRepositoryMock.Verify(c => c.Save(It.Is<Submission>(d => d.SubmissionStatus == SubmissionStatus.Processing)), Times.Once);
            }

Тестируемая единица:

public class ClientGroupMappingService : IClientGroupMappingService
{
    private readonly ISubmissionRepository _submissionRepository;

    public ClientGroupMappingService(IServiceProvider serviceProvider)
    {
        _submissionRepository = serviceProvider.GetRequiredService<ISubmissionRepository>();
    }

    public void ProcessClientGroupMappingImport(Guid submissionID)
    {
        Submission submission = _submissionRepository.GetOne(submissionID).Value;

        submission.SubmissionStatus = SubmissionStatus.Processing;
        _submissionRepository.Save(submission);

        // ..other stuff
    }
}
Moq.MockException : 
    Expected invocation on the mock once, but was 0 times: c => c.Save(It.Is<Submission>(d => (int)d.SubmissionStatus == 2))

Поэтому Verify должна видеть, что был выполнен вызов Save, а параметр, переданный в Save, соответствует условию в предоставленном предикате. Моя реакция коленного рефлекса заключается в том, что, как только я вытаскиваю объект из макета с помощью submissionRepositoryMock.Object, я больше не отслеживаю макет, поэтому вызовы объекта не собираются регистрироваться в макете. Но если это так, как правильно проверить, что мой метод сделал требуемый вызов?

1 Ответ

0 голосов
/ 27 марта 2020

Проблема была в "// ... другом материале", который я вынул для краткости.

Позже в методе SubmissionStatus снова обновляется, и только кажется, что Mock.Verify вычисление REFERENCE для объекта, который был передан в вызов Save, в отличие от VALUE, поскольку все вызовы Save показывают, что он был вызван с SubmissionStatus.Success (что на самом деле не соответствует действительности).

Надеюсь, что это имеет смысл и помогает любому с подобной проблемой.

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