Suche…


Bemerkungen

  • Der DI-Container / Resolver, den wir intern in dieser Bibliothek verwenden, ist Autofac.
  • Das Testframework ist NUnit 3x.
  • Sie sollten diese Bibliothek mit jedem Xamarin.Forms-Framework verwenden können
  • Quell- und Beispielprojekt hier verfügbar

Simple Specflow zum Testen von Befehlen und der Navigation mit NUnit Test Runner

Warum brauchen wir das?

Die aktuelle Methode für Unit-Tests in Xamarin.Forms ist über einen Plattformläufer. Daher muss Ihr Test in einer Ios-, Android-, Windows- oder Mac-Benutzeroberfläche ausgeführt werden: Ausführen von Tests in der IDE

Xamarin bietet auch großartige UI-Tests mit dem Xamarin.TestCloud- Angebot. Wenn BDD-Entwicklerpraktiken implementiert werden sollen und ViewModels und Befehle getestet werden können, während sie auf einem Unit-Testläufer lokal oder auf einem Build-Server kostengünstig ausgeführt werden, gibt es dies nicht in der Weise gebaut.

Ich habe eine Bibliothek entwickelt, die die Verwendung von Specflow mit Xamarin.Forms ermöglicht, um Ihre Features von Ihren Szenariodefinitionen bis zum ViewModel problemlos zu implementieren, unabhängig von allen für die App verwendeten MVVM-Frameworks (wie XLabs , MVVMCross , Prism ).

Wenn Sie noch nicht mit BDD vertraut sind, aktivieren Sie " Specflow out".

Verwendungszweck:

  • Wenn Sie es noch nicht haben, installieren Sie die specflow Visual Studio-Erweiterung von hier (oder von Ihrer Visual Studio-IDE): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6

  • Fügen Sie Ihrem Xamarin.Forms-Projekt eine Klassenbibliothek hinzu. Das ist dein Testprojekt.

  • Fügen Sie das SpecFlow.Xamarin.Forms-Paket aus dem nuget zu Ihren Testprojekten hinzu.

  • Fügen Sie Ihrem Testprojekt eine Klasse hinzu, die 'TestApp' erbt, und registrieren Sie Ihre Ansichten / Ansichtsmodellpaare sowie das Hinzufügen einer DI-Registrierung wie folgt:

    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();
        }
    }
  • Fügen Sie Ihrem Testprojekt eine SetupHook-Klasse hinzu, um Ihre Specflow-Hooks hinzuzufügen. Sie müssen die Testanwendung wie folgt bootstrapieren, wobei Sie die oben erstellte Klasse und das anfängliche Viewmodel Ihrer App angeben:
    [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>();
        }
    }
  • Sie müssen Ihrem xamarin.forms-Ansichten codebehind einen catch-Block hinzufügen, um das xamarin.forms-Framework zu ignorieren, das Sie dazu zwingt, die App ui auszuführen (etwas, das wir nicht möchten):
        public YourView()
        {
            try
            {
                InitializeComponent();
            }
            catch (InvalidOperationException soe)
            {
                if (!soe.Message.Contains("MUST"))
                    throw;
            }
        }
  • Fügen Sie Ihrem Projekt eine specflow-Funktion hinzu (mithilfe der vs specflow-Vorlagen, die im Lieferumfang der vs specflow-Erweiterung enthalten sind).

  • Erstellen / Generieren Sie eine Schrittklasse, die TestStepBase erbt, und übergeben Sie den Parameter scenContext an die Basis.

  • Verwenden Sie die Navigationsdienste und -helfer, um zu navigieren, Befehle auszuführen und Ihre Ansichtsmodelle zu testen:

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

Erweiterte Verwendung für MVVM

Um das erste Beispiel hinzuzufügen, müssen wir dem ViewModel einen Haken für die Navigation geben, um Navigationsanweisungen zu testen, die in der Anwendung vorkommen. Um das zu erreichen:

  • Fügen Sie das Paket SpecFlow.Xamarin.Forms.IViewModel aus Nuget Ihrem PCL Xamarin.Forms-Projekt hinzu
  • Implementieren Sie die IViewModel-Schnittstelle in Ihrem ViewModel. Dadurch wird einfach die Xamarin.Forms INavigation-Eigenschaft angezeigt:
  • public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
  • Das Testframework wird das aufnehmen und die interne Navigation verwalten
  • Sie können jedes MVVM-Framework für Ihre Anwendung verwenden (z. B. XLabs , MVVMCross , Prism), um nur einige zu nennen. Solange die IViewModel-Schnittstelle in Ihrem ViewModel implementiert ist, wird es vom Framework übernommen.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow