Xamarin.Forms
Test dell'unità BDD in Xamarin.Forms
Ricerca…
Osservazioni
- Il contenitore / resolver DI che utilizziamo internamente in questa libreria è Autofac.
- Il framework di test è NUnit 3x.
- Dovresti essere in grado di utilizzare questa libreria con qualsiasi framework Xamarin.Forms
- Fonte e progetto di esempio disponibili qui
Simple Specflow per testare i comandi e la navigazione con NUnit Test Runner
perché ne abbiamo bisogno?
Il modo attuale di eseguire test unitari in Xamarin.Forms è tramite un runner di piattaforma, quindi il test dovrà essere eseguito all'interno di un ambiente ios, android, windows o mac UI: esecuzione dei test nell'IDE
Xamarin fornisce anche fantastici test dell'interfaccia utente con l'offerta Xamarin.TestCloud , ma quando si desidera implementare le pratiche di dev di BDD e avere la possibilità di testare ViewModels e Comandi, mentre si esegue a basso costo su un dispositivo di test di unità localmente o su un server di build, non c'è costruito in modo
Ho sviluppato una libreria che consente di utilizzare Specflow con Xamarin.Forms per implementare facilmente le funzionalità dalle definizioni Scenari fino a ViewModel, indipendentemente da qualsiasi framework MVVM utilizzato per l'app (come XLabs , MVVMCross , Prism )
Se sei nuovo a BDD, controlla l' uscita Specflow .
Uso:
Se non lo hai ancora, installa l'estensione dello studio visivo specflow da qui (o dal tuo IDE di Visual Studio): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6
Aggiungi una libreria di classi al tuo progetto Xamarin.Forms. Questo è il tuo progetto di test.
Aggiungi il pacchetto SpecFlow.Xamarin.Forms da nuget ai tuoi progetti di test.
Aggiungi una classe al tuo progetto di test che eredita "TestApp" e registra le coppie view / modelmodels e aggiungi qualsiasi registrazione DI, come di seguito:
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(); } }
- Aggiungi una classe SetupHook al tuo progetto di test, al fine di aggiungere ganci Specflow. Dovrai eseguire il bootstrap dell'applicazione di test come di seguito, fornendo la classe che hai creato sopra e il tuo viewmodel iniziale dell'app:
[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>(); } }
- Sarà necessario aggiungere un blocco catch al codice code di xamarin.forms per ignorare il framework xamarin.forms che ti obbliga a eseguire l'interfaccia utente ui (qualcosa che non vogliamo fare):
public YourView() { try { InitializeComponent(); } catch (InvalidOperationException soe) { if (!soe.Message.Contains("MUST")) throw; } }
Aggiungi una funzione specflow al tuo progetto (usando i modelli vs specflow forniti con l'estensione vs specflow)
Crea / Genera una classe di passaggi che eredita TestStepBase, passando il parametro scenarioContext alla base.
Utilizza i servizi di navigazione e gli helper per navigare, eseguire comandi e testare i tuoi modelli di visualizzazione:
[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); } }
Uso avanzato per MVVM
Per aggiungere al primo esempio, per testare le istruzioni di navigazione che si verificano all'interno dell'applicazione, è necessario fornire ViewModel con un gancio per la navigazione. Per realizzare questo:
- Aggiungi il pacchetto SpecFlow.Xamarin.Forms.IViewModel da nuget al tuo progetto PCL Xamarin.Forms
- Implementare l'interfaccia IViewModel nel ViewModel. Questo esporrà semplicemente la proprietà INavigation di Xamarin.Form:
-
public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
- Il framework di test lo individuerà e gestirà la navigazione interna
- È possibile utilizzare qualsiasi framework MVVM per l'applicazione (come XLabs , MVVMCross , Prism per citarne alcuni) finché l'interfaccia IViewModel viene implementata nel ViewModel, il framework lo raccoglierà.