Neste artigo vou explicar como criar testes unitários para Entity Framework usando o Effort.
Effort é um framework que ajuda na criação de testes para Entity Framework. Ele é um provider ADO.NET que executa todas as operações em uma base de dados em memória e em tempo de execução. Diferentemente do provider padrão do Entity Framework, ele não usa base de dados tradicional.
Como base vamos criar algumas classes modelo usando o Entity Framework. No artigo anterior que ensina a testar Entity Framework com Moq eu crio essas classes de exemplo. As mesmas também serão utilizadas aqui.
Para inciar temos que alterar o nosso Context do Entity Framework e adicionar um novo construtor.
namespace LuizPauloPradoBlog.Repository.Context
{
public class CarShoppingContext : DbContext
{
public CarShoppingContext() { }
public CarShoppingContext(DbConnection connection) : base(connection, true) { }
public virtual DbSet<Car> Cars { get; set; }
}
}
Esse novo construtor serve para que seja possível criar uma nova conexão (objeto DbConnection) com o Effort e usá-la na nossa classe. O segundo valor corresponde ao parâmetro contextOwnsConnection. Sua definição, na documentação da Microsoft, consiste em não efetuar um dispose na conexão quando for efetuado um dispose no Context também (the connection will not be disposed when the context is disposed if contextOwnsConnection is false). Por isso, usaremos o seu valor como true, pois queremos que o Context efetue dispose na conexão e evite que muito lixo fique em memória por conta dos testes unitários.
Feito isso, vamos adicionar um projeto de unit test na nossa Solution no Visual Studio. Nesse projeto devemos instalar o pacote Effort através do nuget (Install-Package Effort).
Para começar, vamos adicionar o método Initialize() na nossa classe de testes. Nele vamos criar uma nova conexão usando o Effort.
namespace LuizPauloPradoBlog.Tests
{
[TestClass]
public class CarShoppingContextTestWithEffort
{
private CarShoppingContext _context;
private ICarRepository _repository;
[TestInitialize]
public void Initialize()
{
var connection = Effort.DbConnectionFactory.CreateTransient();
_context = new CarShoppingContext(connection);
_repository = new CarRepository(_context);
}
}
}
A documentação do Effort explica que o código Effort.DbConnectionFactory.CreateTransient() cria um objeto do tipo DbConnection que faz a conexão com a nossa base de dados em memória.
Usaremos essa conexão para instanciar a nossa classe de Context e consequentemente usaremos a mesma para instanciar o nosso repositório. Esses objetos serão usados durante a construção dos nossos métodos de teste.
O primeiro método será o ShouldCreateNewCar(), que testa criação de um registro novo. Usaremos o Assert.IsTrue para confirmar que nosso objeto foi adicionado.
[TestMethod]
public void ShouldCreateNewCar()
{
var car = new Car() { Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 };
_repository.Add(car);
Assert.IsTrue(car.Id != 0);
}
O segundo método será o ShouldGetCarById(), que testa a criação de um registro e em seguida já efetua a sua busca, usando o seu Id, no nosso repositório. O Assert.IsNotNull verifica se o objeto foi encontrado e o Assert.IsTrue faz as comparações necessárias para confirmar que o objeto é o mesmo que foi adicionado.
[TestMethod]
public void ShouldGetCarById()
{
var sampleCar = new Car() { Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 };
_repository.Add(sampleCar);
var car = _repository.Get(sampleCar.Id);
Assert.IsNotNull(car);
Assert.IsTrue(car.Id != 0);
Assert.IsTrue(car.Name == sampleCar.Name);
Assert.IsTrue(car.Model == sampleCar.Model);
Assert.IsTrue(car.YearOfManufacture == sampleCar.YearOfManufacture);
}
O terceiro método será o ShouldGetAllCars(), que testa a criação de alguns registros de exemplo e em seguida faz uma listagem deles através do repositório. O Assert.IsNotNull verifica se a listagem foi efetuada e o Assert.IsTrue valida se os mesmos registros foram retornados.
[TestMethod]
public void ShouldGetAllCars()
{
var sampleCarFiesta = new Car() { Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 };
var sampleCarGolf = new Car() { Name = "Golf", Model = "Golf Sport", YearOfManufacture = 2015 };
_repository.Add(sampleCarFiesta);
_repository.Add(sampleCarGolf);
var cars = _repository.GetAll();
Assert.IsNotNull(cars);
Assert.IsTrue(cars.Any());
Assert.IsTrue(cars[0].Id == sampleCarFiesta.Id);
Assert.IsTrue(cars[1].Id == sampleCarGolf.Id);
}

O projeto de exemplo completo pode ser encontrado no meu GitHub.
Se quiserem conhecer mais sobre mim, basta ir aqui no blog no menu quem sou e conferir também o meu LinkedIn.
Se ficou alguma dúvida, comenta aqui no blog que eu tento ajudar. 🙂