Проведите единичный тест, который проверяет, что навигация разрешена только в том случае, если Jobs.Count > 0
. GetJobsAsync()
вызывается во время построения и очищает список вакансий, если не null (получает новый список при каждом его вызове). Похоже, что список вакансий очищается после того, как я вручную добавлю новое задание в качестве условия прохождения модульного теста. Как получить правильное время, чтобы список вакансий не был очищен во время тестирования?Асинхронный метод внутри конструктора, влияющий на модульные тесты
В MyClass конструктор:
this.GetJobsAsync();
GetJobsAsync:
private async void GetJobsAsync()
{
var jobs = await this.dataService.GetJobs();
if (jobs != null)
{
this.Jobs.Clear();
foreach (var job in jobs)
{
this.Jobs.Add(new JobViewModel(job));
}
}
// have the select job command rerun its condition
this.SelectJobCommand.RaiseCanExecuteChanged();
}
Unit тест (должен иметь по крайней мере одно задание для навигации, Работа очищается после добавления задания) :
var vm = new MyClass();
vm.Jobs.Add(new JobVM(new JobModel()));
vm.SelectJobCommand.Execute(null);
Assert.AreEqual(
NavigationKeys.WizardJob,
this.navigationService.CurrentPageKey);
Вот почему у вас нет методов async void, которые не являются методами верхнего уровня. – Servy
Не лучше ли было бы установить DataService для возвращения задания? Таким образом, поток тестирования имитирует поток продукции как можно точнее. Обычно я делаю это, имея объект Mock DataService в своих модульных тестах. –
Проблема в том, что в реальном приложении у вас есть SynchronizationContext, который поддерживает однопоточность и поддерживает порядок для вас, в то время как в модульном тесте у вас нет одного, так что несколько потоков запущены, и у вас есть гонки состояние. –