C # Как тестировать CommandsHandlers, используя паттерны Mediator e CQRS - PullRequest
1 голос
/ 20 марта 2019

Я никогда раньше не работал с TDD, пока не начал изучать некоторые курсы, но я понятия не имею, как это сделать в реальной жизни.

У меня есть этот проект MVC + DDD + Уведомления о Домене + CQRS + Источник событий + Шаблоны Unity of Work и Repository, и я хотел бы проверить, но я не знаю, с чего начать или даже как смоделировать эти инъекции.

Есть мой контроллер

public class DepartmentsController : BaseController
    {
        private readonly IDepartmentAppService _departmentAppService;


        public DepartmentsController(IDepartmentAppService departmentAppService,
            INotificationHandler<DomainNotification> notifications) : base(notifications)
        {
            _departmentAppService = departmentAppService;
        }

        public ActionResult Create(DepartmentViewModel departmentViewModel)
        {
            if (!ModelState.IsValid) return View(departmentViewModel);
            _departmentAppService.CreateDepartment(departmentViewModel);

            if (IsValidOperation())
            {
                this.AddToastMessage("Success", "Department Saved", ToastType.Success);
                return RedirectToAction("Index");
            }

            this.AddToastMessage("Error", GetNotifications().FirstOrDefault()?.Value, ToastType.Error);
            return View(departmentViewModel);
        }
    }

И мой слой Serivce

 private readonly IMediatorHandler _bus;
    private readonly IDepartmentRepository _departmentRepository;
    private readonly IMapper _mapper;


    public DepartmentAppService(IMapper mapper,
        IDepartmentRepository departmentRepository,
        IMediatorHandler bus)
    {
        _departmentRepository = departmentRepository;
        _bus = bus;
        _mapper = mapper;
    }



     public void CreateDepartment(DepartmentViewModel departmentViewModel)
    {
        var registerCommand = _mapper.Map<RegisterDepartmentCommand>(departmentViewModel);
        _bus.SendCommand(registerCommand);
    }

Я создаю этот простой метод тестирования, но я действительно не знаю, чего ожидать, я не уверен, что мне делать на этом этапе, не могли бы вы, ребята, помочь мне здесь?

[TestClass()]
public class DepartmentAppServiceTests
{

    private readonly Mock<IMediatorHandler> _mediatorHandlerMock;
    private readonly Mock<IDepartmentRepository> _departmentRepositoryMock;
    private readonly Mock<IMapper> _mapper;

    public DepartmentAppServiceTests()
    {
        _mediatorHandlerMock = new Mock<IMediatorHandler>();
        _departmentRepositoryMock = new Mock<IDepartmentRepository>();
        _mapper = new Mock<IMapper>();

    }

    [TestMethod()]
    public void CreateDepartmentTest()
    {
        //Arrange
        var fakeDepartment = GetFakeDeparment();
        var fakeDepartmentVm = new DepartmentViewModel();

        Mock<RegisterDepartmentCommand> expected = new Mock<RegisterDepartmentCommand>();
        expected.SetupGet(x => x.Id).Returns(new Guid());
        expected.SetupGet(x => x.Name).Returns("Department Test");

        _departmentRepositoryMock.Setup(x => x.GetById(It.IsAny<Guid>()))
            .Returns(fakeDepartment);

        _mediatorHandlerMock.Setup(x => x.SendCommand(It.IsAny<RegisterDepartmentCommand>()));

        //Act
        var departmentService = new DepartmentAppService(
            _mapper.Object,
            _departmentRepositoryMock.Object,
            _mediatorHandlerMock.Object);


        _mapper.Setup(m => m.Map<Department, DepartmentViewModel>(It.IsAny<Department>())).Returns(fakeDepartmentVm);

        departmentService.CreateDepartment(fakeDepartmentVm);

        //Assert
      //  !_notifications.HasNotifications();



    }

    private Department GetFakeDeparment()
    {
        return new Department()
        {
            Id = new Guid(),
            Name = "fakeName",

        };
    }
}

}

...