具有Mediatr和Moq参数的模拟处理程序

问题描述 投票:1回答:1

我正在尝试使用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?

编辑:我的测试中没有用于中介程序的模拟代码(可重复使用)。我希望能够测试传递true和false的两种情况。如果我像上面提到的那样尝试,则会收到此错误:“无效的回调。具有2个参数的方法上的安装程序无法调用具有不同数量的参数(1)的回调”。

我可以在测试代码中模拟中介程序并将其传递给您:

mockMediatr.Setup(m => m.Send(It.IsAny(),It.IsAny())).returns(异步()=>等待_getBlockedCustomersAndGroupsHandler.Handle(new GetBlockedCustomersAndGroupsQuery {Active = true},new CancellationToken()))]

但是这里我无法在第二个测试中重用它(Active = false),并且我有一些重复的代码。有没有办法做到这一点,还是需要将模拟代码放入测试代码中?

c# moq xunit cqrs mediator
1个回答
0
投票

我发现了如何访问传递的数据。

mockMediatr.Setup(m => m.Send(It.IsAny(), It.IsAny())) .Returns(async (GetBlockedCustomersAndGroupsQuery q, CancellationToken token) => await _getBlockedCustomersAndGroupsHandler.Handle(new GetBlockedCustomersAndGroupsQuery { Active = q.Active}, token));
© www.soinside.com 2019 - 2024. All rights reserved.