Как сделать макет ServiceLocator для совместного использования во всем приложении - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть модульный тест для класса обслуживания в NUnit, где я хочу запустить определенный метод моего сервиса и проверить, что он изменяет некоторые параметры в моей модели данных времени выполнения (сеанс).

Вот пример класса обслуживания, который я тестирую. Агрегатор событий внедряется как зависимость от ServiceLocator:

public class MyService: IMyService 
{
    public MyService() : 
        this(ServiceLocator.Current.GetInstance<IEventAggregator>()) {}

    private async Task<IOperationResult<Unit>> MethodIWantToRun()
    {
        (... do some stuff...)

        someService.CurrentSession.DifferentiateModel(); // this is the problematic method

        return something;
    }
}

Когда запускается «проблемный метод», он приводит к тому, что другой класс вызывает метод, который использует eventAggregator для отображения тоста. Например:

public class SessionModel: ISessionModel
{
    internal SessionModel(someParameters) : this(someParameters, ServiceLocator.Current.GetInstance<IEventAggregator>()) {}

    private void DifferentiateModel()
    {
        var toastEvent = eventAggregator.GetEvent<ToastEvent>();          
        toastEvent.Publish(toastEvent);
    }        
}

Теперь, когда я тестирую модуль MyService, я инициализирую локатор служб. Например:

private static void InitializeServiceLocator()
{
    // Setup servicelocator 
    mockServiceLocator = new Mock<IServiceLocator>();            

    // Setup event aggregator in servicelocator
    var eventAggregator = new Mock<IEventAggregator>();
    var eventMock = new Mock<ToastEvent>();
    eventAggregator.Setup(x => x.GetEvent<ToastEvent>()).Returns(eventMock.Object);
    mockServiceLocator.Setup(serviceLocator => serviceLocator.GetInstance<IEventAggregator>()).Returns(eventAggregator.Object);

    ServiceLocator.SetLocatorProvider(() => mockServiceLocator.Object);
}

Однако переменная toastEvent в классе SessionModel равна нулю, когда я запускаю модульный тест.

Почему экземпляр агрегатора событий не является общим для этого класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...