Поиск…


замечания

  • Контейнер / резольвер DI, который мы используем внутри этой библиотеки, - Autofac.
  • Структура тестирования - NUnit 3x.
  • Вы должны иметь возможность использовать эту библиотеку с любой инфраструктурой Xamarin.Forms
  • Проект источника и примера доступен здесь

Простой Specflow для тестирования команд и навигации с помощью NUnit Test Runner

Почему нам это надо?

Нынешний способ проведения модульного тестирования в Xamarin.Forms осуществляется с помощью платформы, поэтому ваш тест должен работать в среде iOS, Android, Windows или Mac UI: запуск тестов в среде IDE

Xamarin также обеспечивает потрясающее тестирование пользовательского интерфейса с помощью предложения Xamarin.TestCloud , но при желании внедрить методы BDD dev и иметь возможность тестировать ViewModels и Commands, в то время как он работает дешево на отдельных тестовых запусках локально или на сервере сборки, нет встроенный.

Я разработал библиотеку, которая позволяет использовать Specflow с Xamarin.Forms, чтобы легко реализовать ваши функции из определений Scenarios до ViewModel независимо от любой среды MVVM, используемой для приложения (например, XLabs , MVVMCross , Prism )

Если вы новичок в BDD, проверьте, не выпущен ли Specflow .

Использование:

  • Если у вас его еще нет, установите расширение Visual Studio Visual Studio здесь (или из вашей визуальной студии IDE): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6

  • Добавьте библиотеку классов в проект Xamarin.Forms. Это ваш тестовый проект.

  • Добавьте пакет SpecFlow.Xamarin.Forms из nuget в тестовые проекты.

  • Добавьте класс к тестовому проекту, который наследует «TestApp», и зарегистрируйте пары views / viewmodels, а также добавьте регистрацию DI, как показано ниже:

    public class DemoAppTest : TestApp
    {
        protected override void SetViewModelMapping()
        {
            TestViewFactory.EnableCache = false;

            // register your views / viewmodels below
            RegisterView<MainPage, MainViewModel>();
        }

        protected override void InitialiseContainer()
        {
            // add any di registration here
            // Resolver.Instance.Register<TInterface, TType>();
            base.InitialiseContainer();
        }
    }
  • Добавьте класс SetupHook в свой тестовый проект, чтобы добавить к нему специальные захваты. Вам нужно будет загружать тестовое приложение, как показано ниже, предоставляя класс, который вы создали выше, и исходную модель представления вашего приложения:
    [Binding]
    public class SetupHooks : TestSetupHooks
    {   
        /// <summary>
        ///     The before scenario.
        /// </summary>
        [BeforeScenario]
        public void BeforeScenario()
        {
            // bootstrap test app with your test app and your starting viewmodel
            new TestAppBootstrap().RunApplication<DemoAppTest, MainViewModel>();
        }
    }
  • Вам нужно будет добавить блок catch к вашим представлениям xamarin.forms codebehind, чтобы игнорировать фреймворк xamarin.forms, заставляющий вас запускать приложение ui (чего мы не хотим делать):
        public YourView()
        {
            try
            {
                InitializeComponent();
            }
            catch (InvalidOperationException soe)
            {
                if (!soe.Message.Contains("MUST"))
                    throw;
            }
        }
  • Добавьте функцию specflow в ваш проект (используя шаблоны vs specflow, поставляемые с расширением vs specflow)

  • Создайте / сгенерируйте класс шагов, который наследует TestStepBase, передавая параметр stageContext на базу.

  • Используйте навигационные службы и помощники для навигации, выполнения команд и тестирования моделей просмотров:

  [Binding]
    public class GeneralSteps : TestStepBase
    {
        public GeneralSteps(ScenarioContext scenarioContext)
            : base(scenarioContext)
        {
            // you need to instantiate your steps by passing the scenarioContext to the base
        }

        [Given(@"I am on the main view")]
        public void GivenIAmOnTheMainView()
        {
            Resolver.Instance.Resolve<INavigationService>().PushAsync<MainViewModel>();           
            Resolver.Instance.Resolve<INavigationService>().CurrentViewModelType.ShouldEqualType<MainViewModel>();
        }
        
        [When(@"I click on the button")]
        public void WhenIClickOnTheButton()
        {
            GetCurrentViewModel<MainViewModel>().GetTextCommand.Execute(null);
        }

        [Then(@"I can see a Label with text ""(.*)""")]
        public void ThenICanSeeALabelWithText(string text)
        {           
            GetCurrentViewModel<MainViewModel>().Text.ShouldEqual(text);
        }
    }

Расширенное использование для MVVM

Чтобы добавить к первому примеру, чтобы проверить инструкции навигации, которые происходят в приложении, мы должны предоставить ViewModel крючок для навигации. Для достижения этой цели:

  • Добавьте пакет SpecFlow.Xamarin.Forms.IViewModel от NuGet к вашему проекту PCL Xamarin.Forms
  • Внедрите интерфейс IViewModel в ViewModel. Это просто откроет свойство Xamarin.Forms Inavigation:
  • public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
  • В тестовой структуре вы сможете выбрать и управлять внутренней навигацией
  • Вы можете использовать любые фреймворки MVVM для вашего приложения (например, XLabs , MVVMCross , Prism, чтобы назвать несколько). Пока интерфейс IViewModel реализован в вашей ViewModel, инфраструктура подберет его.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow