En este ejercicio vamos a conocer como mejorar las pruebas unitarias de un proyecto de consola en .Net, y luego a hacer una refactorización.
creemos un proyecto de .Net para convertir entre tipos de monedas
-
Crearemos una clase que hará la conversión.
public static class ConversorServicio{
public static decimal ConvertirMoneda(decimal valor, string tipoMoneda){
if (tipoMoneda == "USD"){
return valor / 1500M;
}
else{
if (tipoMoneda == "EUR"){
return valor / 1250M;
}
else if (tipoMoneda == "CAD"){
return valor / 1000M;
}
return 0;
}
}
}
- En el archivo program.cs haremos el llamado
using TestingRefactoring;
Console.WriteLine("***Convertir Monedas***");
//Convertir 100.000 Pesos a Dolares
Console.WriteLine($"100.000 Pesos a Dolares: {decimal.Round(ConversorServicio.ConvertirMoneda(100000, "USD"), 2)}");
//Convertir 100000 Pesos a Euros
Console.WriteLine($"100.000 Pesos a Euros: {decimal.Round(ConversorServicio.ConvertirMoneda(100000, "EUR"))}");
//Convertir 100000 Dolares a dolares canadienses
Console.WriteLine($"100.000 Dolares a Dolares Canadienses: {decimal.Round(ConversorServicio.ConvertirMoneda(100000, "CAD"))}");
- Debemos instalar XUnit, sera la libreria que usaremos para las pruebas unitarias
5)Ahora vemos el archivo de pruebas unitarias y ejecutaremos la siguiente prueba
[Fact]
public void ConvertirPesosDolares_Test1()
{
decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(100000, "USD"), 2);
Assert.Equal(66.67M, result);
}
para ello podemos hacer click en este icono azul y presionamos la opcion "Run"
- vemos que la prueba paso satisfactoriamente
- ahora suponga que queramos crear otra historia con un diferente valor, un tip sería crear una prueba que falle y ver el valor actual
[Fact]
public void ConvertirPesosDolares_Test2()
{
decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(200000, "USD"), 2);
Assert.Equal(70M, result);
}
- Cuando la prueba falla, vemos el valor actual que devuelve el método, actualizamos nuestro código con el valor actual
vemos que la prueba es exitosa
- Ahora como buena practica podemos usar las 3A para las pruebas unitarias (Arrange, Act y Assert), donde definimos las variables, luego ejecutamos la prueba y luego comparamos los resultados
public void ConvertirPesosDolares_Test3()
{
//Arrange
decimal valor = 100000;
string tipoMoneda = "USD";
decimal expected = 66.67M;
//Act
decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(valor, tipoMoneda), 2);
//Assert
Assert.Equal(expected, result);
}
- Ahora con XUnit podemos usamos el atributo [Theory] para ejecutar varias pruebas con diferentes valores en una misma prueba unitaria, para ello primero pasamos los parametros a la prueba unitaria
public void ConvertirPesosDolares_Test4(decimal valor, string tipoMoneda, decimal expected)
luego colocamos el atributo [Theory] seguido del atributo InlineData, por el cual pasaremos los valores a probar
[Theory]
[InlineData(100000, "USD", 66.67)]
[InlineData(100000, "EUR", 80)]
[InlineData(100000, "CAD", 100)]
- La prueba quedaría así
[Theory]
[InlineData(100000, "USD", 66.67)]
[InlineData(100000, "EUR", 80)]
[InlineData(100000, "CAD", 100)]
public void ConvertirPesosDolares_Test4(decimal valor, string tipoMoneda, decimal expected)
{
//Act
decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(valor, tipoMoneda), 2);
//Assert
Assert.Equal(expected, result);
}
- Ejecutamos las prueba y vemos que la prueba se divide en 3 sub pruebas que podemos verificar