Szukaj…


Uwagi

  • Kontener / resolver DI, którego używamy wewnętrznie w tej bibliotece, to Autofac.
  • Ramy testowe to NUnit 3x.
  • Powinieneś być w stanie korzystać z tej biblioteki w dowolnym frameworku Xamarin.Forms
  • Źródło i przykładowy projekt dostępny tutaj

Prosty Specflow do testowania poleceń i nawigacji za pomocą NUnit Test Runner

Dlaczego tego potrzebujemy?

Obecny sposób przeprowadzania testów jednostkowych w Xamarin.Forms odbywa się za pomocą platformy do uruchamiania, więc test będzie musiał zostać przeprowadzony w środowisku interfejsu użytkownika iOS, Android, Windows lub Mac: Uruchamianie testów w IDE

Xamarin zapewnia również niesamowite testy interfejsu użytkownika dzięki ofercie Xamarin.TestCloud , ale gdy chce się wdrożyć praktyki deweloperów BDD i mieć możliwość testowania ViewModels i poleceń, podczas gdy tani działa na testach jednostkowych lokalnie lub na serwerze kompilacji, nie ma zbudowany w sposób.

Opracowałem bibliotekę, która pozwala używać Specflow z Xamarin.Forms do łatwego wdrażania twoich funkcji, od definicji scenariuszy do ViewModel, niezależnie od dowolnej struktury MVVM używanej dla aplikacji (takich jak XLabs , MVVMCross , Prism )

Jeśli dopiero zaczynasz korzystać z BDD, sprawdź Specflow out.

Stosowanie:

  • Jeśli jeszcze go nie masz, zainstaluj rozszerzenie Visual Studio specflow stąd (lub od Ciebie IDE Visual Studio): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6

  • Dodaj bibliotekę klas do swojego projektu Xamarin.Forms. To twój projekt testowy.

  • Dodaj pakiet SpecFlow.Xamarin.Forms z Nuget do projektów badawczych.

  • Dodaj klasę do projektu testowego, który dziedziczy „TestApp”, i zarejestruj swoje pary widoków / modeli, a także dodaj dowolną rejestrację DI, jak poniżej:

    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();
        }
    }
  • Dodaj klasę SetupHook do projektu testowego, aby dodać haki Specflow. Będziesz musiał uruchomić aplikację testową zgodnie z poniższym opisem, podając klasę utworzoną powyżej oraz początkowy model aplikacji:
    [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>();
        }
    }
  • Konieczne będzie dodanie bloku catch do kodu widoków xamarin.forms w celu zignorowania frameworku xamarin.forms zmuszającego do uruchomienia interfejsu użytkownika aplikacji (czego nie chcemy robić):
        public YourView()
        {
            try
            {
                InitializeComponent();
            }
            catch (InvalidOperationException soe)
            {
                if (!soe.Message.Contains("MUST"))
                    throw;
            }
        }
  • Dodaj funkcję specflow do swojego projektu (używając szablonów vs specflow dostarczonych z rozszerzeniem vs specflow)

  • Utwórz / Wygeneruj klasę kroków, która dziedziczy TestStepBase, przekazując parametr scenarioContext do bazy.

  • Użyj usług nawigacyjnych i pomocników do nawigacji, wykonywania poleceń i testowania modeli widoku:

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

Zaawansowane użycie MVVM

Aby dodać do pierwszego przykładu, aby przetestować instrukcje nawigacyjne występujące w aplikacji, musimy zapewnić ViewModel hak do Nawigacji. Osiągnąć to:

  • Dodaj SpecFlow.Xamarin.Forms.IViewModel pakiet z Nuget do projektu PCL Xamarin.Forms
  • Zaimplementuj interfejs IViewModel w swoim ViewModel. Spowoduje to po prostu ujawnienie właściwości Xamarin.Forms INavigation:
  • public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
  • Struktura testowa wykryje to i zarządza wewnętrzną nawigacją
  • Możesz użyć dowolnego frameworka MVVM dla swojej aplikacji (takiego jak XLabs , MVVMCross , Prism, żeby wymienić tylko kilka. Tak długo, jak interfejs IViewModel jest zaimplementowany w twoim ViewModel, framework go odbierze.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow