Buscar..


Observaciones

  • El contenedor / resolución DI que utilizamos internamente en esta biblioteca es Autofac.
  • El marco de prueba es NUnit 3x.
  • Debería poder usar esta biblioteca con cualquier framework Xamarin.Forms
  • Fuente y proyecto de ejemplo disponible aquí.

Sencillo flujo de especificaciones para probar los comandos y la navegación con NUnit Test Runner

¿Porqué necesitamos esto?

La forma actual de realizar pruebas unitarias en Xamarin.Forms es a través de un corredor de plataforma, por lo que su prueba tendrá que ejecutarse en un entorno ios, android, windows o mac UI: Ejecución de pruebas en el IDE

Xamarin también proporciona pruebas de IU impresionantes con la oferta de Xamarin.TestCloud , pero cuando se desean implementar las prácticas de desarrollo de BDD, y tienen la capacidad de probar ViewModels y Comandos, mientras se ejecutan a bajo costo en una unidad de prueba de corredores localmente o en un servidor de compilación, construido de manera

Desarrollé una biblioteca que permite utilizar Specflow con Xamarin.Forms para implementar fácilmente sus funciones desde las definiciones de Scenarios hasta ViewModel, independientemente de cualquier marco MVVM utilizado para la aplicación (como XLabs , MVVMCross , Prism )

Si eres nuevo en BDD, revisa Specflow out.

Uso:

  • Si aún no lo tiene, instale la extensión de estudio visual de flujo de especificaciones desde aquí (o desde su IDE de estudio visual): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6

  • Agregue una biblioteca de clases a su proyecto Xamarin.Forms. Ese es tu proyecto de prueba.

  • Agregue el paquete SpecFlow.Xamarin.Forms de nuget a sus proyectos de prueba.

  • Agregue una clase a su proyecto de prueba que herede 'TestApp', y registre sus pares de vistas / modelos de vista, así como agregue cualquier registro DI, como se muestra a continuación:

    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();
        }
    }
  • Agregue una clase de SetupHook a su proyecto de prueba, para agregar los enlaces de Specflow. Deberá iniciar la aplicación de prueba como se indica a continuación, proporcionando la clase que creó anteriormente y el modelo de vista inicial de su aplicación:
    [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>();
        }
    }
  • Necesitará agregar un bloque catch a sus vistas xamarin.forms codebehind para ignorar el marco de xamarin.forms forzándolo a ejecutar la aplicación ui (algo que no queremos hacer):
        public YourView()
        {
            try
            {
                InitializeComponent();
            }
            catch (InvalidOperationException soe)
            {
                if (!soe.Message.Contains("MUST"))
                    throw;
            }
        }
  • Agregue una función de flujo de especificaciones a su proyecto (usando las plantillas de flujo de especificaciones vs entregadas con la extensión de flujo de especificaciones vs)

  • Cree / genere una clase de paso que herede TestStepBase, pasando el parámetro sceneryContext a la base.

  • Utilice los servicios de navegación y los ayudantes para navegar, ejecutar comandos y probar sus modelos de vista:

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

Uso avanzado para MVVM

Para agregar al primer ejemplo, para probar las declaraciones de navegación que se producen dentro de la aplicación, debemos proporcionar un ViewModel con un gancho a la navegación. Lograr esto:

  • Agregue el paquete SpecFlow.Xamarin.Forms.IViewModel de nuget a su proyecto PCL Xamarin.Forms
  • Implemente la interfaz IViewModel en su ViewModel. Esto simplemente expondrá la propiedad de investigación de Xamarin.Forms:
  • public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
  • El marco de prueba recogerá y gestionará la navegación interna.
  • Puede usar cualquier marco MVVM para su aplicación (como XLabs , MVVMCross , Prism , por nombrar algunos. Mientras la interfaz IViewModel esté implementada en su ViewModel, el marco lo recogerá.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow