Как получить Moq уведомление для юнит-теста Mediatr INotificationHandler - PullRequest
1 голос
/ 11 мая 2019

В настоящее время есть следующий код, который я пытаюсь выполнить модульное тестирование

public class EventReceived: INotification{
    public SpecificItems specificItems {get;};

    public EventReceived(GenericItem items){
        foreach(var genericItem in items){
            specificItems.Add(new SpecificItem(genericItem));
        }
    }
}

public class EventReceivedHandler: INotificationHandler<EventReceived>{
    ....
    public async Task Handle(EventReceived evt){
        do some stuff...
    }
}

Я пытаюсь протестировать метод handle и мне необходимо смоделировать параметр Event Received evt.Однако это конкретный класс, и мне нужно избегать использования логики конструктора, потому что это довольно сложно.Ниже будет запущен конструктор.

_mockEvent = new Mock<EventReceived>

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

public class EventReceived: IEventReceived{
    public EventReceived(...){
        do some stuff...
    }
}

public interface IEventReceived{}

public class EventReceivedHandler: INotificationHandler<IEventReceived>{
    ....
    public async Task Handle(IEventReceived evt){
        do some stuff...
    }
}

_mockEvent = new Mock<IEventReceived>

Каков рекомендуемый способ проверки этих обработчиков событий?Есть ли какое-то простое решение, которое мне не хватает?Я новичок в Mediatr.

1 Ответ

1 голос
/ 11 мая 2019

Единственный бит, который вам нужно проверить, - это метод EventReceivedHandler.Handle.

Если вы используете Mediatr, ваш класс EventReceived должен реализовывать интерфейс INotification. EventReceived не должно содержать никакой логики - это должно быть в EventReceivedHandler

Что-то вроде этого:

public class EventReceived: INotification {
    public EventReceived()
    {

    }
}



public class EventReceivedHandler: INotificationHandler<EventReceived>
{
    public async Task Handle(EventReceived evt){
        //do some stuff...
    }
}


[TestFixture]
public class EventReceivedHandlerTests 
{
    [Test]
    public async Task DoesSomeStuff()
    {
        //arrange
        //(insert mocked interfaces to handler if required)
        var eventHandler = new EventReceivedHandler();
        var evt = new EventReceived();

        //act
        await eventHandler.Handle(evt);

        //assert
        //.......
    }
}
...