Search code examples
c#.nettestingnunitmediator

NUnit, Im using mediator, how can a test my mediator Handler using NUnit


I'm trying to test a handler from my api that is called by the mediator but it seams that it can't be called in the test case. I don't want to mock the mediator nor the handler, just the repositories.

Here my teste code:

using NUnit.Framework;
using Domain.Model;
using Core.Handlers.TimerRegister;
using System.Security.Cryptography.X509Certificates;
using Moq;
using Repository.IRepository;
using System;
using MediatR;

namespace EmployeeRegisterTest.CoreTest
{
    [TestFixture]
    public class TimerRegisterTest
    {
        private Mock<IEmployeeRepository> employeeRepositoryMock = new Mock<IEmployeeRepository>();
        private Mock<IEmployeeTimeRegister> timerRegisterRepositoryMock = new Mock<IEmployeeTimeRegister>();
        private TimerRegisterCommandHandler TimerRegisterCommandHandler;
        private IMediator mediator;

    [Test]
        public async Task MustRegisterTimeCorrecttly()
        {
            
            var employee = new Employee
            { 
                Email = "JorgeEmailTest@email.com",
                EmployeeName = "Jorge",
                Password = "$2a$11$p0655c8x/QoQAjnor0vT8eoK6OagnT1g34b/YN9NkPOtsvlFf828G",
                Role = "mananger",
                Id = 2
            };
            var timeRegister = new TimeRegister
            {
                Employee = employee,
                Id = 1,
                EmployeeTimeRegister = DateTime.Now
            };
            var timerRegistarList = new List<TimeRegister>();
            timerRegistarList.Add(timeRegister);

            var timeRegisterCommandRequest = new TimeRegisterCommandRequest
            {
                EmployeeEmail = employee.Email,
                EmployeeName = employee.EmployeeName,
            };


            employeeRepositoryMock.Setup( x => x.GetEmployee("JorgeEmailTest@email.com"))
                .Returns(Task.FromResult(employee));
            timerRegisterRepositoryMock.Setup(x => x.GetTodayTimeRegisterByEmployeeAndDate(employee, DateTime.Now))
                .Returns(Task.FromResult(timerRegistarList));

            var returns = await mediator.Send(timeRegisterCommandRequest);

            Assert.Equals(returns.message, "Register created successfuly");

        }
    }
}

I tried intilizing the metiator, and did not worked. I tried using costroctor, but it dosen't worked as well. Anyone here hava any ideas how to make this work?


Solution

  • If you are using Microsoft.Dependency.Injection for DI in your project then you can do it like this:

    var services = new ServiceCollection();
     services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(assembliesForMediar));
    //Add the rest of your dependencies 
    services.AddScoped<IEmployeeRepository>(sp => employeeRepositoryMock.Object);
    services.AddScoped<IEmployeeTimeRegister>(sp => timerRegisterRepositoryMock.Object);
    
    var provider = services.BuildServiceProvider();
    
    var mediator = provider.GetServices<IMediator>();
    
    var returns = await mediator.Send(timeRegisterCommandRequest);