Обработчик макетов с параметрами Mediatr и Moq - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь издеваться над обработчиком с Moq. Этот обработчик принимает параметр типа bool для фильтрации активных клиентов и не активных клиентов.

В моем сервисе используется обработчик:

    public async Task<IEnumerable<CustomerDto>> GetCustomers(bool active)
    {
        return _mapper.Map<IEnumerable<CustomerDto>>(await _mediatr.Send(new GetCustomersQuery { Active = active }));
    }

Мой обработчик выглядит так:

public class GetCustomersHandler : IRequestHandler<GetCustomersQuery, IEnumerable<Customer>>
{

    private readonly ICustomersRepository _repository;

    public GetCustomersHandler(ICustomersRepository repository)
    {
        _repository = repository;
    }

    public async Task<IEnumerable<Customer>> Handle(GetCustomersQuery request, CancellationToken cancellationToken)
    {
        return await _repository.GetCustomers(request.Active);
    }
}

Мой тест:

    [Fact]
    public async Task CustomersService_GetCustomers_ActiveReturnsOnlyActiveCustomers()
    {
        var result = await _service.GetCustomers(true);

        // asserts to test result
    }

Мой фиктивный код:

        var mockMediatr = new Mock<IMediator>();
        mockMediatr.Setup(m => m.Send(It.IsAny<GetBlockedCustomersAndGroupsQuery>(), It.IsAny<CancellationToken>()))
            .Returns(async (bool active) => 
                await _getBlockedCustomersAndGroupsHandler.Handle(new GetBlockedCustomersAndGroupsQuery { Active = active }, new CancellationToken())); ---> How can I pass my bool parameter here?

РЕДАКТИРОВАТЬ: У меня нет тестового кода для посредника в моем тесте (для повторного использования). Я хочу иметь возможность протестировать оба сценария ios, где передается true и false. Если я пытаюсь сделать это, как упомянуто выше, я получаю эту ошибку: «Недопустимый обратный вызов. Установка метода с 2 параметрами не может вызвать обратный вызов с другим числом параметров (1)».

Я могу издеваться над посредником в тестовом коде и передайте это:

mockMediatr.Setup(m => m.Send(It.IsAny<GetBlockedCustomersAndGroupsQuery>(), It.IsAny<CancellationToken>()))
            .Returns(async () => 
                await _getBlockedCustomersAndGroupsHandler.Handle(new GetBlockedCustomersAndGroupsQuery { Active = true }, new CancellationToken()));

Но здесь я не могу повторно использовать его во втором тесте (с Active = false), и у меня есть некоторый дублированный код. Есть ли способ сделать это, как это, или мне нужно поместить макет кода внутри тестового кода?

1 Ответ

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

Я нашел, как я могу получить доступ к данным, которые передаются.

mockMediatr.Setup(m => m.Send(It.IsAny(), It.IsAny())) .Returns(async (GetBlockedCustomersAndGroupsQuery q, CancellationToken token) => await _getBlockedCustomersAndGroupsHandler.Handle(new GetBlockedCustomersAndGroupsQuery { Active = q.Active}, token));
...