Как мне выполнить модульное тестирование, которое одна модель представления отправляет другой строке модели представления правильной строки? - PullRequest
1 голос
/ 25 марта 2019

В конструкторе модели представления у меня есть объявление команды, которое вызывает метод:

OpenGroupCommand = new DelegateCommand(OnOpenGroupExecute);

И метод выглядит так:

private void OnOpenGroupExecute(object obj)
        {
            string groupName = (string)obj;
            Application.Current.MainPage.Navigation.PushAsync(new GroupPage(groupName));
        }

Как я могу проверить, что groupName правильно передается в другую модель представления?В другом представлении параметр модели groupName отправляется в свойство GroupName экземпляра виртуальной машины:

public class GroupPageViewModel : ViewModelBase, IGroupPageViewModel
    {
        private string _groupName;
        public GroupPageViewModel(string groupName)
        {
            LoadGroupName(groupName);
        }
        public void LoadGroupName(string groupName)
        {
            GroupName = groupName;
        }
        public string GroupName
        {
            get
            {
                return _groupName;
            }
            set
            {
                _groupName = value;
                OnPropertyChanged();
            }
        }
    }

При отладке все работает нормально, но как я могу выполнить его модульное тестирование?Где я могу прочитать немного о тестировании и насмешках вроде этого, даже с Moq framework?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Хорошо, давайте посмотрим, что у вас есть:

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

  2. что делает этот метод?Это совсем не ясно, он получает объект, мы не знаем, что в нем.Вы преобразовываете это в строку, но что если это не строка?Можете ли вы преобразовать этот объект в строку?кто знает.

Итак, у нас есть метод, который мы не знаем, что он делает, мы не знаем, что он получает в качестве параметров, мы не можем вызвать его напрямую,но мы хотим проверить это.Это не очень хорошая позиция.

Сделайте шаг назад и спросите себя, что вы на самом деле пытаетесь проверить?

Вы сказали: Как я могу проверить, чтоgroupName передается другой модели представления правильно?

что означает «правильно»?Вам нужно определить, что означает для этой строки правильный .Это даст тестовый сценарий, с которым вы можете работать.

Я ожидаю получить объект, который выглядит как A, и я хочу преобразовать его в строку, которая выглядит как B. Пока забудьте о моделях представления, это просто неважный шум.

Вы можете изменить метод на общедоступный и проверить, что для разных типов входных данных вы получите правильный результат.Это буквально, работа с объектом и извлечение некоторых вещей из него.Если этот метод верен, вы можете гарантировать, что модель представления получит правильный ввод, и это достаточно хорошо с точки зрения модульного тестирования.

Вы, конечно, можете добавить больше тестов для различных входов, вы можете проверитьдля правильных условий отказа и т. д.

0 голосов
/ 26 марта 2019

Я считаю, что ваш вопрос на самом деле о том, как проверить навигацию между страницами.

В реализации метода OnOpenGroupExecute, поскольку вы используете материал форм Xamarin для реализации навигации, вы должны ссылаться на сборки форм Xamarin в своем тестовом проекте, что делает модульный тест зависимым от форм Xamarin.

Как предлагается в этом документе https://docs.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/, попробуйте создать интерфейс для навигации и навигации с помощью viewmodel (подробнее о https://github.com/dotnet-architecture/eShopOnContainers)

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

public class FakeNavigationService : INavigationService //this interface is from MS eShopOnContainer project
{
    private List<ViewModelBase> _viewModels = new List<ViewModel>();

    public Task NavigateToAsync<TViewModel>() where TViewModel : ViewModelBase {
        //create viewModel object from DI container
        //var viewModel = ......
        _viewModels.Add(viewModel);
    }

    public ViewModelBase CurrentPageViewModel {
        get {
            if (_viewModels.Count() < 1) {
                return null;
            }
            return _viewModels[_viewModels.Count() - 1];
        }
    }
}

Это всего лишь совет. Если вы реализовали большинство функций в своем приложении, потребуется время, чтобы изменить навигацию со страницей для навигации с помощью-viewmodel.

...