【发布时间】:2021-01-09 00:38:56
【问题描述】:
我有一个 .NET Core v2.1。带有 CQRS 的 API。为了简化控制器,我正在使用 MediatR。 现在我正在尝试使用 xUnit 为我的处理程序编写一些单元测试,但它抛出了这个异常:
StackTrace 执行结果:在 Research.Application.EventoContext.Commands.ConfirmarPresencaCommandHandler.Handle(ConfirmarPresensaCommand 请求,CancellationToken 取消令牌)在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& 状态机)在 Research.Application.EventoContext.Commands.ConfirmarPresencaCommandHandler.Handle(ConfirmarPresensaCommand 请求,CancellationToken 取消令牌)在 Research.Application.EventoContext.Commands.ConfirmarPresencaCommandHandler.Handle() 在 C:\Users\public\Desktop\Research\ResearchAPI\app\src\Research.Teste\Commands\EventoCommands.cs:line 38 --- 从以前抛出异常的位置结束堆栈跟踪 --- Mensagem do Resultado: System.MissingMethodException : 找不到方法:'System.Threading.Tasks.Task
1<!!0> MediatR.IMediator.Send(MediatR.IRequest1, System.Threading.CancellationToken)'。
这是我的命令和处理程序。由于我没有存储库,因此我使用 DbSets 和 SaveChangeAsync() 方法创建了一个数据上下文接口:
public class ConfirmarPresensaCommand : IRequest<PontuacaoVM>
{
public Guid id_usuario { get; set; }
public Guid id_evento { get; set; }
public List<Guid> sub_eventos { get; set; }
}
public class ConfirmarPresensaCommandHandler : IRequestHandler<ConfirmarPresensaCommand, PontuacaoVM>
{
private readonly IMySqlContext _context;
private readonly IMediator _mediator;
public ConfirmarPresensaCommandHandler(IMySqlContext context, IMediator mediator)
{
_context = context;
_mediator = mediator;
}
public async Task<PontuacaoVM> Handle(ConfirmarPresensaCommand request, CancellationToken cancellationToken)
{
var _presenca = await _context.PresencasUsuarios
.Include(p => p.SubEvento)
.Where(p => p.CodigoUsuario == request.id_usuario &&
p.SubEvento.CodigoEvento == request.id_evento)
.FirstOrDefaultAsync();
if (_presenca == null)
{
var _subEvento = await _context.SubEventos
.Where(s => s.CodigoEvento == request.id_evento &&
s.Principal)
.FirstOrDefaultAsync();
await _context.PresencasUsuarios.AddAsync(new PresencaUsuario
{
CodigoUsuario = request.id_usuario,
CodigoSubEvento = _subEvento.Codigo,
}, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
}
return await _mediator.Send(new GerarPontuacaoCommand(request.id_usuario, "Evento", "Confirmar"));
}
}
这是我的测试。我正在使用 Moq.EntityFrameworkCore v2.0.1:
public class ConfirmarEventoTeste : TesteUtils
{
public Mock<IMySqlContext> _moqContext;
public Mock<IMediator> _moqMediator;
public ConfirmarEventoTeste()
{
_moqContext = new Mock<IMySqlContext>();
_moqMediator = new Mock<IMediator>();
_moqMediator.Setup(m => m.Send(It.IsAny<ConfirmarPresencaCommand>(), It.IsAny<CancellationToken>()).ReturnsAsync(It.IsAny<PontuacaoVM>());
}
[Fact]
public async Task ConfirmarPresenca_Sucesso()
{
var _command = new ConfirmarPresensaCommand();
var _handler = new ConfirmarPresensaCommandHandler(_moqContext.Object, _moqMediator.Object);
var _result = await _handler.Handle(_command, new CancellationToken());
Assert.NotNull(_result);
}
}
我知道我需要为单元测试工作编写设置,但现在我担心的是测试中的 Handle() 调用甚至没有命中我的 Handler。
有人可以帮我吗?
【问题讨论】:
标签: asp.net-core moq xunit cqrs mediatr