【问题标题】:Issue while Unit Testing ASP.Net Core with Mediatr使用 Mediatr 对 ASP.Net Core 进行单元测试时出现问题
【发布时间】:2020-12-03 10:38:06
【问题描述】:

我正在使用 ASP.Net Core 3.1 存储库模式和使用 Dapper 的工作单元。 我使用调解器作为

using MediatR;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
 
namespace TaskManagementApp.Api.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ApiController : ControllerBase
    {
        private IMediator _mediator;
        protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
    }
}

我面临的问题是如何编写单元测试来为 HttpContext.RequestServices.GetService 设置值

这是我要进行单元测试的控制器

namespace OneCubeCoaching.API.WebApi.Controllers
{
    [Route("api/[controller]")]
    public class ContactController : BaseApiController
    {
        [Authorize]
        [HttpGet("GetAll")]
        public async Task<IActionResult> Index()
        {
            return Ok(await Mediator.Send(new GetAllClientQuery()));
        }
    }
}

【问题讨论】:

  • 实际问题/问题是什么?没有看到问题说明。

标签: unit-testing asp.net-core moq xunit mediatr


【解决方案1】:

只依赖于构造函数中的 IMediator。

假设您的代码您的意思是 ApiController 实际上是 BaseApiController(根据您的第二个代码段),这样的事情会起作用:

[Route("api/[controller]")]
[ApiController]
public class BaseApiController : ControllerBase
{
    protected ApiController(IMediator mediator)
    {
        _mediator = mediator;
    }

    protected IMediator {get; private set;}
}

那么你的ContactController 可以将 IMediator 传递给 base:

[Route("api/[controller]")]
public class ContactController : BaseApiController
{
    public ContactController (IMediator mediator) 
        :base(mediator)

    [Authorize]
    [HttpGet("GetAll")]
    public async Task<IActionResult> Index()
    {
        return Ok(await Mediator.Send(new GetAllClientQuery()));
    }
}

现在,您可以像往常一样模拟 IMediator。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 2019-07-28
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多