【问题标题】:How to mock service injected by HttpContext.RequestServices.GetService<> in derived controller?如何在派生控制器中模拟 HttpContext.RequestServices.GetService<> 注入的服务?
【发布时间】:2020-04-23 10:34:15
【问题描述】:

我有这样定义的基本 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?

【问题讨论】:

  • 在你的单元测试中也使用 HttpContext.RequestServices.GetService()

标签: c# unit-testing asp.net-core .net-core moq


【解决方案1】:

您应该使用 Moq 或 NSubstitute 等库来模拟它。然后使用这些库连接方法。

【讨论】:

  • 我为 IMediator 创建了模拟,设置如下: _mediatorMock.Setup(mediator => mediator.Send(//somelogic); 当我使用构造函数 DI 时,我可以这样做:var controller = new AuthController(_mediatorMock.Object); 现在的事情是 AuthController 是无参数的。
  • 在您的类 BaseController 中,您没有在那里使用构造函数注入。 IMediator 正在内部解决。您应该通过构造函数公开它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2020-04-02
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多