1

I am using ASP.Net Core 3.1 Repository Pattern and Unit of Work Using Dapper . I have use mediator as

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>();
    }
}

i am facing issue how can i write unit test to set value for HttpContext.RequestServices.GetService

here is my controller to be unit tested

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()));
        }
    }
}

1 Answers1

0

Just depend on IMediator in the constructor.

Assuming your code you meant ApiController was in fact BaseApiController (per your second code segment) something like this will work:

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

    protected IMediator {get; private set;}
}

Then your ContactController can pass IMediator to 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()));
    }
}

Now, you can Mock IMediator as you normally would.

Alex
  • 37,502
  • 51
  • 204
  • 332