Юнит-тестирование в MvvmCross - PullRequest
0 голосов
/ 04 марта 2020

Попытка юнит-тестирования навигации в одном из моих командных вызовов в закрытый метод. Просто пытаюсь проверить, был ли сделан запрос на навигацию в результате выполнения этой команды.

Это старая документация; https://www.mvvmcross.com/documentation/fundamentals/testing

Эта документация не учитывает новые вызовы на основе asyn c, насколько я обнаружил; Например, IMvxMainThreadAsyncDispatcher Либо нам нужно реализовать два метода ExecuteOnMainThreadAsyn c, либо наследовать от MvxMainThreadAsyncDispatcher в MockDispatcher.

Также необходимо добавить регистрацию IMvxMainThreadAsin

var mockDispatcher = new MockDispatcher();

...

...

Ioc.RegisterSingleton<IMvxMainThreadAsyncDispatcher>(MockDispatcher);
1012 *1013* 10 * *1013* 1013 * 10 * *. *

Так что почти все тесты работают, кроме запросов на навигационные вызовы. Приведенный ниже метод внутри MockDispatcher никогда не вызывается, поэтому я не могу проверить количество запросов;

public async Task<bool> ShowViewModel(MvxViewModelRequest request)
{
     Requests.Add(request);
     return true;
}

У кого-нибудь есть рабочий код, который будет издеваться, и вызовет этот запрос или в какой-либо другой форме? IMvxMainThreadDispatcher устанавливается как абсолютный, и вызовы навигации больше не выполняются с ShowViewModel <> () в MVVMCross, это делается путем вызова navigationService.Navigate ();

1 Ответ

0 голосов
/ 04 марта 2020

Ну, я нашел решение моего вопроса ... ShowViewModel вызывается, когда служба навигации корректно смоделирована. Я нашел фрагмент кода на GitHub из собственного репозитория MvvmCross о том, как они проводят тесты для навигации. Моей следующей задачей было бы смоделировать целевую viewModel, но это отдельный код, и приведенный ниже код не покрывает это. Раньше у меня был очень простой c IMvxNavigationService макет.

var mockLocator = new Mock<IMvxViewModelLocator>();
mockLocator.Setup(
                m => m.Load(It.IsAny<Type>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxNavigateEventArgs>())).Returns(() => new FakeViewModel());
mockLocator.Setup(
                m => m.Reload(It.IsAny<IMvxViewModel>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxNavigateEventArgs>())).Returns(() => new FakeViewModel());

var mockCollection = new Mock<IMvxViewModelLocatorCollection>();
mockCollection.Setup(m => m.FindViewModelLocator(It.IsAny<MvxViewModelRequest>()))
                .Returns(() => mockLocator.Object);

Ioc.RegisterSingleton(mockLocator.Object);

var loader = new MvxViewModelLoader(mockCollection.Object);

_navigationService = new MvxNavigationService(null, loader)
{
      ViewDispatcher = MockDispatcher,
};
_navigationService.LoadRoutes(new[] { typeof(YourViewModelTestClass).Assembly });
Ioc.RegisterSingleton<IMvxNavigationService>(_navigationService);
...