如何在派生控制器中模拟 HttpContext.RequestServices.GetService<> 注入的服务?
How to mock service injected by HttpContext.RequestServices.GetService<> in derived controller?
我有这样定义的基础 Api 控制器
[ApiController]
public abstract class BaseController : ControllerBase
{
private IMediator _mediator;
protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
}
从 BaseController 派生的授权控制器
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?
您应该使用 Moq 或 NSubstitute 等库来模拟它。然后使用这些库连接方法。
我有这样定义的基础 Api 控制器
[ApiController]
public abstract class BaseController : ControllerBase
{
private IMediator _mediator;
protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
}
从 BaseController 派生的授权控制器
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?
您应该使用 Moq 或 NSubstitute 等库来模拟它。然后使用这些库连接方法。