Recherche…


Remarques

  • Le conteneur / résolveur DI que nous utilisons en interne dans cette bibliothèque est Autofac.
  • Le framework de test est NUnit 3x.
  • Vous devriez pouvoir utiliser cette bibliothèque avec n'importe quel framework Xamarin.Forms
  • Source et exemple de projet disponible ici

Spécflow simple pour tester les commandes et la navigation avec NUnit Test Runner

Pourquoi avons nous besoin de ça?

La manière actuelle de faire des tests unitaires dans Xamarin.Forms est via un runner de plate-forme, votre test devra donc s'exécuter dans un environnement d'interface utilisateur ios, android, windows ou mac: Exécution de tests dans l'EDI

Xamarin fournit également des tests d'interface utilisateur impressionnants avec l'offre Xamarin.TestCloud , mais lorsque vous souhaitez implémenter des pratiques de développement BDD et que vous avez la possibilité de tester ViewModels et les commandes, tout en fonctionnant à peu de frais sur un serveur de test local ou sur un serveur de construction, construit de manière.

J'ai développé une bibliothèque qui permet d'utiliser Specflow avec Xamarin.Forms pour implémenter facilement vos fonctionnalités depuis vos définitions de scénarios jusqu'à ViewModel, indépendamment de tout framework MVVM utilisé pour l'application (tels que XLabs , MVVMCross , Prism ).

Si vous découvrez le BDD, cochez la case Specflow out.

Usage:

  • Si vous ne l'avez pas encore, installez l'extension visuelle studio specflow à partir d'ici (ou de votre IDE studio visuel): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6

  • Ajoutez une bibliothèque de classes à votre projet Xamarin.Forms. C'est votre projet de test.

  • Ajoutez le package SpecFlow.Xamarin.Forms de nuget à vos projets de test.

  • Ajoutez une classe à votre projet de test qui hérite de 'TestApp', et enregistrez vos paires views / viewmodels, ainsi que tout enregistrement DI, comme indiqué ci-dessous:

    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();
        }
    }
  • Ajoutez une classe SetupHook à votre projet de test afin d'ajouter vos hooks Specflow. Vous devrez lancer l'application de test comme indiqué ci-dessous, en indiquant la classe que vous avez créée ci-dessus et le modèle de vue initial de votre application:
    [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>();
        }
    }
  • Vous devrez ajouter un bloc catch à votre xamarin.forms views codebehind afin d'ignorer le framework xamarin.forms vous obligeant à exécuter l'application ui (ce que nous ne voulons pas faire):
        public YourView()
        {
            try
            {
                InitializeComponent();
            }
            catch (InvalidOperationException soe)
            {
                if (!soe.Message.Contains("MUST"))
                    throw;
            }
        }
  • Ajouter une fonctionnalité de spécification à votre projet (en utilisant les modèles vs specflow fournis avec l'extension vs specflow)

  • Créez / générez une classe d'étape qui hérite de TestStepBase, en transmettant le paramètre scenarioContext à la base.

  • Utilisez les services de navigation et les assistants pour naviguer, exécuter des commandes et tester vos modèles de vue:

  [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);
        }
    }

Utilisation avancée pour MVVM

Pour ajouter au premier exemple, afin de tester les instructions de navigation qui se produisent dans l'application, nous devons fournir le ViewModel avec un crochet à la navigation. Pour y parvenir:

  • Ajoutez le package SpecFlow.Xamarin.Forms.IViewModel de nuget à votre projet PCL Xamarin.Forms
  • Implémentez l'interface IViewModel dans votre ViewModel. Cela exposera simplement la propriété Xamarin.Forms INavigation:
  • public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
  • Le framework de test le récupérera et gérera la navigation interne
  • Vous pouvez utiliser n'importe quel framework MVVM pour votre application (comme XLabs , MVVMCross , Prism , etc.) . Tant que l'interface IViewModel est implémentée dans votre ViewModel, le framework le récupérera.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow