Xamarin.Forms
Тестирование блоков BDD в Xamarin.Forms
Поиск…
замечания
- Контейнер / резольвер 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, инфраструктура подберет его.