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, инфраструктура подберет его.