ASP.NET Core - Testes com NUnit e EF Core in Memory - I
Neste artigo veremos como realizar testes para operações CRUD em uma aplicação ASP.NET Core Web API usando o Unit e o EF Core in Memory. |
O objetivo é garantir que cada parte do código esteja funcionando corretamente, detectar erros antes que eles afetem outras partes do sistema e permitir que os desenvolvedores refatorem o código com segurança.
O xUnit funciona criando classes de teste, que contêm métodos que realizam testes específicos, onde cada método de teste deve seguir um padrão de nomeação específico, por exemplo, "TestMétodoAcaoResultadoEsperado".
O framework também possui diversos atributos e métodos auxiliares que permitem a configuração e a verificação dos testes. Os principais recursos do xUnit incluem:
O xUnit é um framework popular para testes de unidade na plataforma .NET, devido à sua facilidade de uso, flexibilidade e recursos avançados. Ele é usado por desenvolvedores e equipes de desenvolvimento em todo o mundo para garantir a qualidade do código e aumentar a confiança de que o código está funcionando corretamente.
Vamos criar um projeto ASP.NET Core Web API usando o .NET 7.0 onde vamos realizar o CRUD básico para gerenciar informações dos posts de um Blog.
recursos usados:
Criando e configurando o projeto
Vamos criar um projeto ASP.NET Core Web API chamado ApiBlog usando o VS 2022 usando o EF Core na abordagem Code-First.
A seguir inclua no projeto os seguintes pacotes nuget:
Crie a pasta Entities no projeto e nesta pasta crie a classe Post com o seguinte código:
public class Post
{
public int PostId { get; set; }
public string? Titulo { get; set; }
public string? Descricao { get; set; }
public DateTime DataCriacao { get; set; }
public int CategoriaId { get; set; }
public Categoria? Categoria { get; set; }
}
|
A seguir vamos criar na mesma pasta a classe Categoria:
public class Categoria
{
public Categoria()
{
Post = new HashSet<Post>();
}
public int Id { get; set; }
public string? Nome { get; set; }
public string? Chave { get; set; }
public ICollection<Post>? Post { get; set; }
}
|
A seguir crie a pasta Context e nela crie a classe AppDbContext que herda da classe DbContext do EF Core:
public class
AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public virtual DbSet<Categoria> Categorias { get; set; }
protected override void OnModelCreating(ModelBuilder
modelBuilder)
entity.Property(e => e.Nome)
entity.Property(e => e.Chave)
modelBuilder.Entity<Post>(entity =>
entity.Property(e => e.CategoriaId)
entity.Property(e => e.DataCriacao)
entity.Property(e => e.Descricao)
entity.Property(e => e.Titulo)
entity.HasOne(d => d.Categoria) |
O arquivo de contexto define o mapeamento da entidade para a tabela do SQL Server e no método OnModelCreating estamos definindo o mapeamento ORM das entidades.
Vamos definir no arquivo appsettings.json a string de conexão com o SQL Server:
{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=BlogDB;Trusted_Connection=True;TrustServerCertificate=True;" }, ... |
Como estamos usando o EF Core 7.0 temos que incluir a propriedade TrustServerCertificate=True; na string de conexão.
Agora vamos registrar o serviço do contexto no Contêiner DI na classe Program:
using
Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddCors(option => option.AddPolicy("MeuBlogPolicy", builder => { builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod(); })); builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer builder.Services.AddScoped<IPostRepository, PostRepository>(); var app = builder.Build();... app.UseHttpsRedirection(); app.UseAuthorization(); app.UseCors("MeuBlogPolicy"); app.MapControllers(); app.Run(); |
A seguir podemos aplicar o Migrations usando os seguintes comandos na sequência :
Ao final teremos o banco BlogDB criado no SQL Server e contendo as tabelas Posts e Categorias :
Criando o Repositório
Vamos criar no projeto a pasta Repositories e nesta pasta implementar o repositório de Posts que vão conter a lógica de negócios para todas as nossas operações relacionadas aos posts.
Vamos criar a classe PostDto na pasta DTOs para realizar a transferência de dados :
public
class
PostDto { public int PostId { get; set; } public string? Titulo { get; set; } public string? Descricao { get; set; } public int CategoriaId { get; set; } public DateTime DataCriacao { get; set; } public string? CategoriaNome { get; set; } } |
A seguir vamos criar a interface IPostRepository:
public
interface
IPostRepository { Task<List<Categoria>> GetCategorias(); Task<List<PostDto>> GetPosts(); Task<PostDto> GetPost(int? postId); Task<int> AddPost(Post post); Task<int> DeletePost(int? postId); Task UpdatePost(Post post); } |
A seguir temos a classe concreta PostRepository que implementa esta interface :
public class
PostRepository : IPostRepository { private readonly AppDbContext db; public PostRepository(AppDbContext _db) { db = _db; }
public async Task<List<Categoria>> GetCategorias()
return null;
public async Task<List<PostDto>> GetPosts()
return null;
public async Task<PostDto> GetPost(int? postId)
return null;
public async Task<int> AddPost(Post post)
return post.PostId;
return 0;
public async Task<int> DeletePost(int? postId)
if (db is not null)
if (post != null)
public async Task UpdatePost(Post post) |
Para concluir vamos criar na pasta Controllers o controlador PostsController com o código abaixo:
using ApiBlog.Entities; using ApiBlog.Repositories; using Microsoft.AspNetCore.Mvc; namespace ApiBlog.Controllers;
[Route("api/[controller]")]
[HttpGet]
[HttpGet]
[HttpGet]
try
if (post == null)
return Ok(post);
[HttpPost]
[HttpPost]
if (postId == null)
try
[HttpPost]
return Ok();
return BadRequest(); |
Com isso temos nossa API pronta para ser usada e executando o projeto teremos os endpoints exibidos na interface do Swagger como mostra a figura:
Na próxima parte do artigo vamos criar o projeto de testes usando o NUnit.
Pegue o projeto aqui: ApiBlog1.zip (sem as referências)
"Porque Deus, que disse que das trevas resplandecesse a luz, é
quem resplandeceu em nossos corações, para iluminação do
conhecimento da glória de Deus, na face de Jesus Cristo"
2 Coríntios
4:6
Referências: