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.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow