Os testes em C# não ficam em camadas da aplicação, no caso, para desenvolver um teste, criamos uma aplicação nova de testes. Verificando nos templates que o C# disponibiliza através de:
dotnet new --list
Poderemos ver o template de 'xUnit Test Project', ou seja, é um tipo de biblioteca que o Asp.Net tem para testar aplicações.
1 - Primeiramente, fora do diretório da API principal, executamos o comando:
dotnet new xunit -o [nome_do_projeto.test]
Um novo diretório paralelo ao diretório principal vai ser criado e automaticamente um arquivo solution vai ser criado, que serve para integrar vários projetos diferentes.
2 - Criando um novo arquivo solution:
dotnet new sln --name [nome da solution]
3 - Adicionando para integrar o projeto de teste e a aplicação. Um projeto em C# é identificado pelo arquivo .csproj, para adicionar na solution os dois projetos:
dotnet add sln [diretório]
Tanto para a aplicação como para o projeto de teste, por exemplo:
dotnet add sln Projeto/Projeto.csproj
dotnet add sln Projeto.Teste/Projeto.Teste.csproj
4 - Os projetos devem ser referenciados um ao outro. No projeto principal deve ser incluido dentro do arquivo .csproj uma tag dessa forma o projeto tem uma visibilidade interna para o projeto de teste:
<ItemGroup>
InternalVisibleTo Include = "Nome_do_projeto_de_teste" />
</ ItemGroup>
5 - No projeto de teste devemos adicionar uma referencia para a aplicação, onde também devemos utilizar uma tag e adicionar todo o caminho:
<ItemGroup>
<ProjectReference Include = ".../caminho_do_projeto.csproj"
</ ItemGroup>
Assim como um npm install no Node.js devemos adicionar alguns pacotes para trabalhar com testes, no .NET utilizamos o comando 'dotnet add package'.
6 - Seguindo a orientação de um novo projeto em MVC podemos adicionar:
dotnet add package Microsoft.AspNetCore.MVC.Testing --version [escolher a versão]
- Hosting, que serve para simular a API principal dentro da API de testes:
dotnet add package Microsfot.AspNetCore.Hosting --version [escolher a versão]
- Para trabalhar com testes é importante ler e manipular arquivos JSON:
dotnet add package Newtonsoft.Json --version [escolher a versão]
- Pacote responsável para realização de mocks:
dotnet add package Moq --version [escolher a versão]
7 - Na raiz do projeto da API principal, no arquivo Program.cs é preciso fazer uma alteração para o teste construir a aplicação, após a última linha do app.run():
public partial class Program()
Partial serve para substituir o funcionamento da classe Program, ou seja, quando você declara uma classe como partial, você pode definir diferentes partes dessa classe em arquivos separados. Todas essas partes são combinadas durante a compilação para formar uma única definição da classe, ou seja, no projeto de teste vai ser identificado a classe Program.
Existem alguns atributos para testes que são usados no framework de testes xUnit.net para escrever e organizar testes.
O Fact é usado para definir um teste unitário simples. Ele indica que um método é um teste que deve ser executado sem parâmetros. Cada método marcado com Fact é executado como um teste independente.
Exemplo:
public class MathTests
{
[Fact]
public void TestAddition()
{
Assert.Equal(4, 2 + 2);
}
}
O Theory, por outro lado, é usado para escrever testes parametrizados. Você fornece dados de entrada para um Theory através de atributos de dados. O teste é então executado com diferentes conjuntos de dados de entrada, permitindo testar vários cenários com a mesma lógica de teste.
Exemplo:
public class MathTests
{
[Theory(DisplayName = "Testando Soma"]
[InlineData(3, 1, 2)]
[InlineData(5, 2, 3)]
public void TestAddition(int expected, int a, int b)
{
Assert.Equal(expected, a + b);
}
}
No exemplo acima são realizados dois testes com um único método de teste.
Para verificar apenas um teste específico na sua aplicação:
dotnet test --filter NomedaClassedeTeste
Ou ainda o teste específico dentro da sua classe de teste:
dotnet test --filter NomedaClassedeTeste.Método