# 10.6 Agregando pruebas para las Categorías

En nuestro proyecto **xUnit.CaducaRest** vamos a crear una nueva clase llamada **CategoriasTests** esta clase tendrá todas las pruebas unitarias para la tabla Categorias. Vamos a probar la regla para validar que no se pueda crear una categoría con el mismo nombre.

Como comentarios indicamos que ya conocemos que existe una categoría con el nombre **Analgésicos** ya que este fue creado en la base de datos en memoria.

Como nombre le ponemos el nombre de la regla que vamos a probar, en el caso de la categoría la clase se llama **AgregarNombreRegla**, luego indicamos el caso a probar, en este caso **NombreRepetido** y al final agregamos el valor esperado, en este caso sería **Falso**, de esta forma indicamos que en la tabla Categoría hay una regla que debe regresar falso si el nombre ya existe.

En el constructor de la clase inicializamos la base de datos en memoria y el objeto locService.

Mandamos llamar a la función **ValidarRegla** de nuestra clase **AgregarNombreRegla** y el valor esperado debería ser **falso**, con **Assert.False** comprobamos que el valor regresado por la función sea **False**.

{% tabs %}
{% tab title="CategoriaTests.cs" %}

```csharp
public class CategoriaTests
{
    CaducaContext contexto;
    LocService locService;
    public CategoriaTests()
    {
        contexto = new CaducaContextMemoria().ObtenerContexto();
        locService = new MockLocService().ObtenerLocService();
    }
    
    /// <summary>
    /// Validamos que no se pueda agregar una categoria con un nombre repetido
    /// El resultado debería ser falso
    /// </summary>
    [Fact]
    public async Task ReglaNombreUnico_ConNombreRepetido_RegresaFalsoAsync()
    {
        //Inicialización de datos (Arrange)
        var categoriaDAO = new CategoriaDAO(contexto, locService);
        //Obtenemos la lista de categorías si esta vacía agregamos una
        List<Categoria> categorias = await categoriaDAO.ObtenerTodoAsync();
        if (categorias.Count==0)
        {
            categorias.Add(new Categoria 
                        { Clave = 1, Nombre = "Analgésicos" });
        }
        //Método a probar (Act)
        ReglaNombreUnico agregarNombreRegla = new 
            ReglaNombreUnico(categorias[0].Id, 
                             categorias[0].Nombre, 
                             contexto, 
                             locService);
        //Comprobación de resultados (Assert)
        Assert.False(agregarNombreRegla.EsCorrecto());
    }   
}
```

{% endtab %}
{% endtabs %}

Por lo general en las pruebas unitarias se prueban todos los posibles casos, en nuestro caso la regla debe regresar true si el nombre no existe

{% tabs %}
{% tab title="CategoriaTests.cs" %}

```csharp
/// <summary>
/// Validamos que no se pueda agregar una categoria con un nombre repetido
/// El resultado debería ser true
/// </summary>
[Fact]
public async Task ReglaNombreUnico_ConNombreNoRepetido_RegresaVerdaderoAsync()
{
    //Inicialización de datos (Arrange)
    var categoriaDAO = new CategoriaDAO(contexto, locService);
    //Obtenemos la lista de categorías si esta vacía agregamos una
    List<Categoria> categorias = await categoriaDAO.ObtenerTodoAsync();
    if (categorias.Count == 0)
    {
        categorias.Add(new Categoria { Clave = 1, Nombre = "Análgesicos" });
    }
    //Método a probar (Act)
    ReglaNombreUnico agregarNombreRegla = new ReglaNombreUnico
                        (2,"Antibióticos", contexto, locService);
    //Comprobación de resultados (Assert)
    Assert.True(agregarNombreRegla.EsCorrecto());
}
```

{% endtab %}
{% endtabs %}

De esta forma nos aseguramos que futuros cambios a nuestro código no vayan a provocar nuevos errores.

{% hint style="info" %}
Las funciones de la base de datos como agregar, borrar, modificar se deben probar como pruebas de integración
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://abi.gitbook.io/net-core/8.-pruebas-unitarias/8.5-agregando-pruebas-para-las-categorias.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
