Limpeza de banco de dados no Entity Framework

Por que precisamos disso?

O ideal é que os testes de unidade não exijam persistência de dados, mas este é o mundo real e alguns testes precisarão executar código que lê do banco de dados. Se o seu software for bem projetado, simular o contexto do banco de dados pode ser uma opção para você.

No entanto, se você optar por persistir os dados para testes de integração, ou por qualquer outro motivo, é muito útil ter algum meio de limpar seus dados de teste antes ou depois de serem executados. Excluir manualmente os registros que você cria para teste é muito complicado e as restrições de chave estrangeira tornam muito mais difícil simplesmente esvaziar todas as tabelas do banco de dados. Nessa situação, queremos desesperadamente que algo automático faça isso por nós.

Como podemos alcançá-lo?

Felizmente, com um pouco de SQL, para qualquer tabela X dada, podemos encontrar todas as tabelas que têm restrições de chave estrangeira apontando para X e, com um pouco de programação, podemos resolver essas tabelas recursivamente e deletar da parte inferior da árvore para cima .

Para isso, criei um pacote chamado DatabaseCleaner . O código-fonte está disponível no GitHub .

Como posso usar?

Usá-lo não poderia ser mais simples. Depois de instalar o pacote do NuGet, você pode limpar uma árvore de tabelas com duas linhas de código. Tudo que você precisa especificar é uma tabela para começar e uma Funcque retornará uma nova instância de um DbContextderivado. Igual a:

public class FooTest
{
[TestInitialize]
public virtual void Before()
{
var scheduler = new Scheduler(() => new MyDbContext("name=MyConnectionString"), "Client");
scheduler
.Schedule();
}
}

Quão maduro é?

No momento em que este livro foi escrito, o pacote é novo e muito básico. Não há dúvida de que alguns recursos seriam convenientes de se ter, como:

  1. Forneça um nome de classe de entidade que DatabaseCleanerresultará em um nome de tabela.
  2. A capacidade de limpar automaticamente todas as tabelas sem especificar um ponto de partida.

Felizmente, o pacote é de código aberto. Sinta-se à vontade para bifurcar e enviar uma solicitação de pull para qualquer coisa que você considere útil!