Xamarin.Forms
BDD-enhetstestning i Xamarin.Forms
Sök…
Anmärkningar
- Den DI-behållare / upplösare som vi använder internt i detta bibliotek är Autofac.
- Testramen är NUnit 3x.
- Du bör kunna använda detta bibliotek med alla Xamarin.Forms-ramar
- Källa och exempelprojekt tillgängligt här
Enkelt flöde för att testa kommandon och navigering med NUnit Test Runner
Varför behöver vi detta?
Det nuvarande sättet att göra enhetstestning i Xamarin.Forms är via en plattformslöpare, så ditt test måste köra inom en ios-, Android-, windows- eller mac-UI-miljö: Köra tester i IDE
Xamarin tillhandahåller också fantastiska UI-tester med Xamarin.TestCloud- erbjudandet, men när man vill implementera BDD-dev-metoder och har möjlighet att testa ViewModels och kommandon, medan man kör billigt på en enhetstestlöpare lokalt eller på en build-server, finns det inte byggd på sätt.
Jag utvecklade ett bibliotek som gör det möjligt att använda Specflow med Xamarin.Forms för att enkelt implementera dina funktioner från dina Scenarios-definitioner fram till ViewModel, oberoende av alla MVVM-ramverk som används för appen (som XLabs , MVVMCross , Prism )
Om du är ny med BDD, kolla Specflow out.
Användande:
Om du inte har det ännu, installera specflow Visual Studio-förlängningen härifrån (eller från din Visual Studio IDE): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6
Lägg till ett klassbibliotek till ditt Xamarin.Forms-projekt. Det är ditt testprojekt.
Lägg till SpecFlow.Xamarin.Forms-paketet från nuget till dina testprojekt.
Lägg till en klass till ditt testprojekt som ärver 'TestApp', och registrera dina vyer / visningsmodellpar samt lägg till alla DI-registrering, enligt nedan:
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(); } }
- Lägg till en SetupHook-klass i ditt testprojekt för att lägga till dina Specflow-krokar. Du måste starta om testapplikationen enligt nedan, tillhandahålla klassen du skapade ovan och den ursprungliga visningsmodellen för din 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>(); } }
- Du måste lägga till ett fångstblock i din xamarin.forms visningar codebehind för att ignorera xamarin.forms ramverk som tvingar dig att köra appen ui (något vi inte vill göra):
public YourView() { try { InitializeComponent(); } catch (InvalidOperationException soe) { if (!soe.Message.Contains("MUST")) throw; } }
Lägg till en specflowfunktion till ditt projekt (med hjälp av vs-flödesmallarna som levereras med vs specflow-förlängningen)
Skapa / generera en stegklass som ärver TestStepBase och överför parametern scenarioContext till basen.
Använd navigeringstjänsterna och hjälparna för att navigera, köra kommandon och testa dina visningsmodeller:
[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); } }
Avancerad användning för MVVM
För att lägga till det första exemplet måste vi förse TestModel med en krok till navigeringen för att testa navigationssatser som inträffar i applikationen. För att uppnå detta:
- Lägg till paketet SpecFlow.Xamarin.Forms.IViewModel från nuget till ditt PCL Xamarin.Forms-projekt
- Implementera IViewModel-gränssnittet i din ViewModel. Detta kommer helt enkelt att avslöja Xamarin.Forms INVigation-egenskapen:
-
public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
- Testramen kommer att hämta det och hantera intern navigering
- Du kan använda valfritt MVVM-ramverk för din applikation (t.ex. XLabs , MVVMCross , Prism för att nämna några. Så länge IViewModel-gränssnittet implementeras i din ViewModel, kommer ramverket att plocka upp det.