top of page
Buscar
Foto del escritorMiguel Angel Barrera

Mejorando la experiencia de pruebas unitarias en aplicaciones .NET MAUI con IPreferences

Actualizado: 27 sept 2023

Introducción


En el emocionante mundo de desarrollo de aplicaciones .NET MAUI, el manejo de preferencias del usuario es una parte esencial. Normalmente, hemos utilizado la clase estática Preferences.Default para gestionar las preferencias de nuestra aplicación. Sin embargo, esta práctica puede dificultar la realización de pruebas unitarias efectivas en nuestros ViewModels y servicios.


En este artículo, exploraremos cómo podemos mejorar la testabilidad de nuestras aplicaciones .NET MAUI utilizando la interfaz IPreferences en lugar de Preferences.Default. Aprenderás a realizar pruebas unitarias en un ViewModel que hace uso de IPreferences con la ayuda de Moq.


Los Desafíos de Usar Preferences.Default en las Pruebas Unitarias


El Uso de Preferences.Default en pruebas unitarias presenta desafíos significativos. Este enfoque vincula nuestras pruebas directamente al entorno real de preferencias, lo que puede hacer que las pruebas sean frágiles y difíciles de mantener. Además, la falta de aislamiento de pruebas y la dificultad para simular comportamientos específicos pueden afectar la efectividad de nuestras pruebas. En lugar de depender de Preferences.Default, es aconsejable utilizar IPreferences y poder mejorar la robustez de las pruebas unitarias. Este enfoque facilita la simulación de diferentes escenarios y garantiza pruebas más efectivas y confiables.


Utilizando IPreferences en .NET MAUI


En esta sección, exploraremos cómo utilizar la interfaz IPreferences para gestionar las preferencias de la aplicación en lugar de depender de la clase estática Preferences.Default.



Nuestro viewmodel, con un método sencillo seria algo así:

// Implementando el ViewModel utilizando IPreferences
    public class MyViewModel

    {
        private readonly IPreferences preferences;

        public MyViewModel(IPreferences appPreferences)
        {
            this.preferences = appPreferences;
        }

        public bool CanGoToNextPage()
        {
            var userIsLogged = preferences.Get("USER_LOGGED_KEY", false);

            if (userIsLogged)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

Ahora vamos a registrar en el inyector de dependencias (MauiProgram) el viewmodel y la interfaz IPreferences:

// Registrando la implementación de IPreferences y el viewmodel en la inyección de dependencia
builder.Services.AddSingleton(Preferences.Default);
builder.Services.AddTransient<MyViewModel>();

Realizando pruebas unitarias con Moq


En esta sección, aprenderemos cómo realizar pruebas unitarias efectivas en un ViewModel que utiliza IPreferences (la interfaz de Microsoft.Maui.Storage) utilizando Moq y NUnit.


Aquí tienes un ejemplo donde tenemos un método CanGoToNextPage que en función de una preferencia nos dice si podemos navegar a la siguiente pantalla.


Luego realizaremos unos test unitarios que verifiquen que la el valor devuelto de dicho método es correcto en función de lo que exista en preferencias:



//  Escribiendo pruebas unitarias utilizando Moq
[TestFixture]
public class MyViewModelTests
{
            [TestCase]
        public void If_User_Is_Logged_You_Can_Go_To_Next_Page()
        {
            bool userIsLogged = true;

            var preferencesMoq = new Mock<IPreferences>();
            preferencesMoq
                .Setup(p => p.Get(It.IsAny<string>(), It.IsAny<bool>(), null))
                .Returns(userIsLogged);

            var viewModel = new MyViewModel(preferencesMoq.Object);

            bool canGoToNextPage = viewModel.CanGoToNextPage();

            Assert.That(canGoToNextPage, Is.True);
        }
        
        [TestCase]
        public void If_User_Is_Not_Logged_You_Can_Not_Go_To_Next_Page()
        {
            bool userIsLogged = false;

            var preferencesMoq = new Mock<IPreferences>();
            preferencesMoq
                .Setup(p => p.Get(It.IsAny<string>(), It.IsAny<bool>(), null))
                .Returns(userIsLogged);

            var viewModel = new MyViewModel(preferencesMoq.Object);

            bool canGoToNextPage = viewModel.CanGoToNextPage();

            Assert.That(canGoToNextPage, Is.False);

} }


Conclusión


En este artículo, hemos explorado cómo mejorar la testeabilidad de las aplicaciones .NET MAUI al utilizar la interfaz IPreferences en lugar de depender de Preferences.Default para gestionar las preferencias del usuario. Hemos demostrado que el uso de IPreferences proporciona beneficios significativos en términos de pruebas unitarias más sólidas y fiables.


En resumen, al adoptar las prácticas descritas en este artículo, los desarrolladores pueden elevar la calidad y la robustez de sus aplicaciones .NET MAUI, al tiempo que facilitan el mantenimiento y la evolución de sus pruebas unitarias. La transición de Preferences.Default a IPreferences es un paso valioso para aquellos que buscan construir aplicaciones más sólidas y fiables en el emocionante mundo del desarrollo de aplicaciones .NET MAUI.

21 visualizaciones0 comentarios

Entradas recientes

Ver todo

Comments


bottom of page