我有像一样定义的基本Api控制器
[ApiController]
public abstract class BaseController : ControllerBase
{
private IMediator _mediator;
protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
}
从BaseController 派生的Auth控制器
public class AuthController : BaseController
{
[HttpPost(ApiRoutes.Auth.Register)]
public async Task<IActionResult> Register(UserRegistrationRequest request)
{
var response = await Mediator.Send(new UserRegistrationCommand(request.Email, request.Password));
return Ok(response);
}
}
在单元测试中应该如何模拟IMediator服务?当使用构造函数DI注入服务时,我刚刚在测试中将模拟服务传递给构造函数,但在这种情况下,我不确定要模拟什么,可能是HttpContext?
您可以使用这种方式将参数传递给控制器等。
Mock<IMediatr> _mediatrMock;
AuthController _controller;
public AuthControllerTest()
{
_mediatrMock = new Mock<IMediatr>();
var httpContext = new Mock<HttpContext>();
httpContext.Setup(x => x.RequestServices.GetService(typeof(IMediatr)))
.Returns(_mediatrMock.Object);
_controller = new AuthController();
_controller.ControllerContext.HttpContext = httpContext.Object;
}
[Fact]
public async Task Register_ShouldReturnOk()
{
var req= new UserRegistrationRequest();
var result = _controller.Register(req);
var resultObject = result as OkObjectResult;
Assert.Equal(...);
}
您应该使用Moq或NSubstitute之类的库来模拟它。然后使用这些库连接方法。