如何在派生控制器中模拟 HttpContext.RequestServices.GetService<> 注入的服务?



我有像一样定义的基本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之类的库来模拟它。然后使用这些库连接方法。

最新更新