У меня есть модульный тест для класса обслуживания в 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 равна нулю, когда я запускаю модульный тест.
Почему экземпляр агрегатора событий не является общим для этого класса?