Testando Entity Framework com Effort

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);
}

Captura de Tela 2016-07-13 às 23.31.44

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. 🙂

Testando Entity Framework com Moq

Neste artigo vou explicar como fazer teste unitário para Entity Framework utilizando o pacote Moq do C#. Com ele podemos simular comportamentos específicos em nossas classes e configurar cenários de testes.

Antes de começar, vamos criar uma estrutura simples de objeto, entidade e respositório com Entity Framework.

namespace LuizPauloPradoBlog.Repository.Model
{
    public class Car
    {
        public int Id { get; set; }
        public string Model { get; set; }
        public string Name { get; set; }
        public int YearOfManufacture { get; set; }
    }
}
namespace LuizPauloPradoBlog.Repository.Context
{
    public class CarShoppingContext : DbContext
    {
        public CarShoppingContext() { }

        public virtual DbSet<Car> Cars { get; set; }
    }
}
namespace LuizPauloPradoBlog.Repository
{
    public class CarRepository : ICarRepository
    {
        private readonly CarShoppingContext _context;

        public CarRepository(CarShoppingContext context)
        {
            _context = context;
        }

        public IList<Car> GetAll()
        {
            return _context.Cars.ToList();
        }

        public Car Get(int id)
        {
            return _context.Cars.FirstOrDefault(x => x.Id == id);
        }

        public void Add(Car car)
        {
            _context.Cars.Add(car);
            _context.SaveChanges();
        }
    }
}

Com essa estrutura básica criada, basta adicionar um novo projeto do tipo Unit Test no Visual Studio clicando em Solution > Add > New Project > Test > Unit Test Project.

Um ponto importante antes de começar a escrever os testes é lembrar-se de instalar o pacote Moq.

Install-Package Moq -Version 4.5.10

Screenshot_1

Moq (ou Mock) é um framework para realizar e configurar simulações em métodos e classes. A configuração de um objeto usando Moq é bem conveniente para se criar testes unitários e simular comportamentos que validem o funcionamento em determinados cenários.

Para inciar, vamos fazer um teste que chama o repositório e realiza a inclusão de um novo registro. Nesse exemplo vamos fazer o teste criando o método ShouldCreateNewCar(). Para isso, é preciso fazer um mock do DbSet do objeto, um mock do Context do Entity Framework e um mock da classe de repositório.

A notação consiste em instanciar um objeto Mock informando o tipo de objeto que deverá ser simulado. A linha de código fica da seguinte maneira: new Mock.

Logo abaixo temos um mock do nosso objeto DbSet.

var _dbSet = new Mock<DbSet<Car>>();

O próximo passo é fazer o mesmo com o Context do Entity Framework. Aqui entra o conceito de efetuar uma configuração (usando o método Setup) do nosso objeto mock para especificar um comportamento do mesmo. Neste caso, devemos configurá-lo para retornar um DbSet especifico ao chamar a nossa entidade de exemplo.

var _dbSet = new Mock<DbSet<Car>>();

var _context = new Mock<CarShoppingContext>();
_context.Setup(x => x.Cars).Returns(_dbSet.Object);

Com isso feito, usaremos os objetos mock como parâmetro na classe de repositório. Ela será instanciada no teste e receberá os objetos que criamos. Isso irá permitir testar a classe usando objetos de simulação que possuem o comportamento que configuramos anteriormente.

namespace LuizPauloPradoBlog.WebApi.Tests
{
    [TestClass]
    public class CarShoppingContextTestWithMock
    {
        [TestMethod]
        public void ShouldCreateNewCar()
        {
            var _dbSet = new Mock<DbSet<Car>>();

            var _context = new Mock<CarShoppingContext>();
            _context.Setup(x => x.Cars).Returns(_dbSet.Object);

            var _repository = new CarRepository(_context.Object);

            var sampleCar = new Car() { Id = 3, Name = "Civic", Model = "Honda Civic SE", YearOfManufacture = 2016 };

            _repository.Add(sampleCar);

            _dbSet.Verify(m => m.Add(It.IsAny<Car>()), Times.Once());
            _context.Verify(m => m.SaveChanges(), Times.Once());
        }
    }
}

Após isso, para validar o comportamento do que foi executado, usaremos o método Verify para confirmar que um objeto foi adicionado ao DbSet e também confirmar que o método de SaveChanges do Context foi devidamente acionado.

No segundo teste vamos chamar o repositório e realizar a listagem de alguns registros. Nesse exemplo vamos criar o método ShouldGetAllCars().

A preparação dos objetos mock seguem a mesma lógica do teste anterior. A diferença fica por conta de incluir registros de teste no DbSet e efetuar as configurações de um IQueryable que represente o nosso DbSet.

namespace LuizPauloPradoBlog.WebApi.Tests
{
    [TestClass]
    public class CarShoppingContextTestWithMock
    {
        [TestMethod]
        public void ShouldGetAllCars()
        {
            var sampleData = new List<Car>()
            {
                new Car() { Id = 1, Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 },
                new Car() { Id = 2, Name = "Golf", Model = "Golf Sport", YearOfManufacture = 2015 }
            }.AsQueryable();

            var _dbSet = new Mock<DbSet<Car>>();
            _dbSet.As<IQueryable<Car>>().Setup(x => x.Provider).Returns(sampleData.Provider);
            _dbSet.As<IQueryable<Car>>().Setup(x => x.Expression).Returns(sampleData.Expression);
            _dbSet.As<IQueryable<Car>>().Setup(x => x.ElementType).Returns(sampleData.ElementType);
            _dbSet.As<IQueryable<Car>>().Setup(x => x.GetEnumerator()).Returns(sampleData.GetEnumerator());

            var _context = new Mock<CarShoppingContext>();
            _context.Setup(x => x.Cars).Returns(_dbSet.Object);

            var _repository = new CarRepository(_context.Object);

            var cars = _repository.GetAll();

            Assert.IsNotNull(cars);
            Assert.IsTrue(cars.Any());
        }
    }
}

Neste caso, efetuamos a criação de uma lista de registros de exemplo como IQueryable e configuramos o mock do DbSet para utilizá-la. Ao chamar o método de GetAll() no repositório, o mesmo deve retornar exatamente os dados de exemplo que configuramos.

Por fim, podemos organizar melhor a configuração dos objetos de mock no método Initialize da classe de testes. O resultado ficou assim:

namespace LuizPauloPradoBlog.WebApi.Tests
{
    [TestClass]
    public class CarShoppingContextTestWithMock
    {
        private Mock<DbSet<Car>> _dbSet;
        private Mock<CarShoppingContext> _context;
        private ICarRepository _repository;

        [TestInitialize]
        public void Initialize()
        {
            var sampleData = new List<Car>()
            {
                new Car() { Id = 1, Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 },
                new Car() { Id = 2, Name = "Golf", Model = "Golf Sport", YearOfManufacture = 2015 }
            }.AsQueryable();

            _dbSet = new Mock<DbSet<Car>>();
            _dbSet.As<IQueryable<Car>>().Setup(x => x.Provider).Returns(sampleData.Provider);
            _dbSet.As<IQueryable<Car>>().Setup(x => x.Expression).Returns(sampleData.Expression);
            _dbSet.As<IQueryable<Car>>().Setup(x => x.ElementType).Returns(sampleData.ElementType);
            _dbSet.As<IQueryable<Car>>().Setup(x => x.GetEnumerator()).Returns(sampleData.GetEnumerator());

            _context = new Mock<CarShoppingContext>();
            _context.Setup(x => x.Cars).Returns(_dbSet.Object);

            _repository = new CarRepository(_context.Object);
        }

        [TestMethod]
        public void ShouldCreateNewCar()
        {
            var sampleCar = new Car() { Id = 3, Name = "Civic", Model = "Honda Civic SE", YearOfManufacture = 2016 };
            _repository.Add(sampleCar);

            _dbSet.Verify(m => m.Add(It.IsAny<Car>()), Times.Once());
            _context.Verify(m => m.SaveChanges(), Times.Once());
        }

        [TestMethod]
        public void ShouldGetAllCars()
        {
            var cars = _repository.GetAll();

            Assert.IsNotNull(cars);
            Assert.IsTrue(cars.Any());
        }
    }
}

O projeto de exemplo pode ser encontrado no meu GitHub.

Pra quem quer pesquisar mais, o framework Moq possui muitas outras opções de métodos disponíveis, vale a pena conferir a documentação dele.

Se ficou alguma dúvida, comenta aqui no blog que eu tento ajudar. 🙂

Teste Unitário para Controllers no ASP.NET Web API 2 com IHttpActionResult

Neste artigo vou explicar como programar testes unitários para controllers do ASP.NET Web API 2 que retornam seus dados em uma resposta HTTP do tipo IHttpActionResult.

O projeto base para este artigo pode ser encontrado no post que explica testes unitários para controllers do ASP.NET Web API 2 que retornam seus dados em uma resposta HTTP do tipo HttpResponseMessage.

Aqui no blog também tem outro post que explica a diferença entre o IHttpActionResult e o HttpResponseMessage.

Assim como no outro artigo, devemos iniciar adicionando um projeto de testes na nossa solução do Visual Studio. Para adicioná-lo basta clicar com o botão direito do mouse na sua solution e seguir os passos Add > New Project > Test > Unit Test Project.

Um ponto importante é se lembrar de adicionar o pacote Microsft.AspNet.WebApi.Core para que seja possível criar os objetos de controller na nossa classe de testes.

Acessando o projeto exemplo no GitHub vocês podem conferir que o método Initialize() faz as inicialização do repositório já com alguns dados de exemplo.

O primeiro teste irá validar o comportamento de listar todos os registros do nosso repositório através do método Get() da controller.

Nele iremos instanciar o nosso controller e passar como parâmetro um objeto de repositório com os nossos dados de exemplo. Em seguida iremos chamar o método Get() e o seu retorno será armazenado na variável result.

[TestMethod]
public void ShouldGetAllCars()
{
    var controller = new CarController(_repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    var result = controller.Get() as OkNegotiatedContentResult<IEnumerable<Car>>;

    Assert.IsNotNull(result);
    Assert.IsNotNull(result.Content);
    Assert.AreEqual(3, result.Content.Count());
}

O resultado do tipo IHttpActionResult, para ser devidamente testado, precisa ser armazenado numa variável do tipo OkNegotiatedContentResult. Esse tipo de objeto corresponde ao conteúdo do resultado sendo considerado como uma reposta HTTP do tipo Ok.

Mais tipos de objetos podem ser encontrados no namespace System.Web.Http.Results. Por exemplo, uma resposta HTTP do tipo Created pode ser testada usando o CreatedNegotiatedResult, ou uma resposta HTTP do tipo NotFound pode ser testada usando o NotFoundResult. Na documentação oficial do ASP.NET Web API 2 temos uma explicação mais detalhada sobre esses objetos.

Para validar o resultado iremos usar o Assert.IsNotNull que verifica se a resposta retornada não é vazia. Em seguida validamos que o conteúdo dessa reposta também não é vazio. A última validação usa o Assert.AreEqual para verificar se os registros retornados possuem a mesma quantidade que foi configurada ao criar o objeto de repositório, neste caso, se o result.Content.Count() é igual a 3.

Outro tipo teste interessante para se fazer é validar se o tipo de reposta representa um código HTTP de erro como NotFound ou BadRequest. No nosso projeto de teste temos um método de ShouldReturnNotFound() para validar que um GET retornou o código de status HTTP correspondente a um NotFound.

[TestMethod]
public void ShouldReturnNotFound()
{
    var controller = new CarController(_repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    var result = controller.Get("Ferrari F7");

    Assert.IsInstanceOfType(result, typeof(NotFoundResult));
}

Os demais métodos de teste para cada ação do nosso controller seguem a mesma estrutura dos exemplos mostrados. A diferença está no que está sendo validado. Pode ser um campo do objeto, pode ser a quantidade de registros retornados, ou até mesmo se o objeto é nulo. Acompanhe abaixo a classe de testes com todos os métodos.

[TestMethod]
namespace LuizPauloPradoBlog.WebApi.Tests
{
    [TestClass]
    public class CarControllerTest
    {
        private ICarRepository _repository;

        [TestInitialize]
        public void Initialize()
        {
            var carSamples = new List<Car>();
            carSamples.Add(new Car() { Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 });
            carSamples.Add(new Car() { Name = "Golf", Model = "Golf Sport", YearOfManufacture = 2015 });
            carSamples.Add(new Car() { Name = "Civic", Model = "Civic S", YearOfManufacture = 2016 });

            _repository = new CarRepository(carSamples);
        }

        [TestMethod]
        public void ShouldGetAllCars()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var result = controller.Get() as OkNegotiatedContentResult<IEnumerable<Car>>;

            Assert.IsNotNull(result);
            Assert.IsNotNull(result.Content);
            Assert.AreEqual(3, result.Content.Count());
        }

        [TestMethod]
        public void ShouldGetCar()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var result = controller.Get("Fiesta SE") as OkNegotiatedContentResult<Car>;

            Assert.IsNotNull(result);
            Assert.IsNotNull(result.Content);
            Assert.AreEqual(result.Content.Model, "Fiesta SE");
        }

        [TestMethod]
        public void ShouldPostCar()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var newCar = new Car() { Name = "IX 35", Model = "IX 35 Special", YearOfManufacture = 2016 };

            var result = controller.Post(newCar) as CreatedNegotiatedContentResult<Car>;

            Assert.IsNotNull(result);
            Assert.IsNotNull(result.Content);
            Assert.AreEqual(result.Content.Name, newCar.Name);
            Assert.AreEqual(result.Content.Model, newCar.Model);
            Assert.AreEqual(result.Content.YearOfManufacture, newCar.YearOfManufacture);
        }

        [TestMethod]
        public void ShouldReturnNotFound()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var result = controller.Get("Ferrari F7");

            Assert.IsInstanceOfType(result, typeof(NotFoundResult));
        }
    }
}

O último passo é conferir se está tudo funcionando corretamente e executar todos os testes do projeto.

Captura de Tela 2016-06-13 às 19.39.03

O projeto completo de exemplo 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, ou se algo não funcionou, deixa um comentário aqui no blog que esclareço as dúvidas.

Teste Unitário para Controllers no ASP.NET Web API 2 com HttpResponseMessage

Neste artigo vou explicar como desenvolver testes unitários para controllers do ASP.NET Web API 2 que retornam  seus dados em uma resposta HTTP do tipo HttpResponseMessage.

No ASP.NET Web API 2 os métodos no controller podem retornar, por exemplo, dois tipos de resposta HTTP: HttpResponseMessage ou IHttpActionResult. Para entender melhor a diferença entre eles é só dar um olhada nesse outro post que explica melhor como cada um funciona.

Para iniciar vamos criar um objeto de exemplo para usar no repositório.

namespace LuizPauloPradoBlog.Repository.Model
{
    public class Car
    {
        public string Model { get; set; }
        public string Name { get; set; }
        public int YearOfManufacture { get; set; }
    }
}

Depois da criação do objeto de exemplo, basta criar um repositório simples, sem envolver muitos conceitos avançados, que vai persistir nossos dados.

namespace LuizPauloPradoBlog.Repository
{
    public class CarRepository : ICarRepository
    {
       private List<Car> _cars;

        public CarRepository(List<Car> cars)
        {
            _cars = cars;
        }

        public CarRepository()
        {
            _cars = new List<Car>();
        }

        public void Add(Car car)
        {
            _cars.Add(car);
        }

        public Car Get(string model)
        {
            return _cars.FirstOrDefault(x => x.Model == model);
        }

        public IEnumerable<Car> GetAll()
        {
            return _cars;
        }
    }
}

Terminado o repositório, será necessário criar um controller para acessar esses métodos e criar as respostas HTTP usando HttpResponseMessage.

namespace LuizPauloPradoBlog.Repository.Model
namespace LuizPauloPradoBlog.WebApi.Controllers
{
    public class CarController : ApiController
    {
        private ICarRepository _repository;

        public CarController(ICarRepository repository)
        {
            _repository = repository;
        }

        public HttpResponseMessage Get()
        {
            var cars = _repository.GetAll();

            return Request.CreateResponse(cars);
        }

        public HttpResponseMessage Get(string model)
        {
            var car = _repository.Get(model);

            if (car == null)
                return Request.CreateResponse(HttpStatusCode.NotFound);

            return Request.CreateResponse(car);
        }

        public HttpResponseMessage Post(Car car)
        {
            _repository.Add(car);

            return Request.CreateResponse(HttpStatusCode.Created, car);
        }
    }
}

Nosso controller contém alguns métodos de exemplo para listar todos os registros com o Get(), localizar um registro por modelo do carro com o Get(string model) e cadastrar um registro novo com o Post(Car car).

É neste ponto que chegamos onde queremos. Toda estrutura básica de um projeto está criada e finalmente podemos adicionar o projeto de testes que irá validar o comportamento do nosso controller.

Pará adicioná-lo basta clicar com o botão direito do mouse na sua solution e seguir os passos Add > New Project > Test > Unit Test Project.

Captura de Tela 2016-06-07 às 17.55.14

Após a criação do projeto de testes, um passo muito importante é se lembrar de adicionar o pacote Microsft.AspNet.WebApi.Core para que seja possível criar os objetos de controller na nossa classe de testes.

Nosso primeiro teste vai validar o comportamento de selecionar um registro do nosso repositório através do método Get(string model) do controller.

[TestMethod]
public void ShouldGetCar()
{
    var controller = new CarController(_repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    var result = controller.Get("Fiesta SE");

    Car car;

    Assert.IsTrue(result.TryGetContentValue<Car>(out car));
    Assert.AreEqual(car.Model, "Fiesta SE");
}

Primeiramente iremos instanciar  o nosso controller e passar como parâmetro um objeto de repositório com os nossos dados de exemplo. Em seguida iremos chamar o método Get(string model) e o seu retorno será armazenado na variável result. Para validar o resultado iremos usar o Assert.IsTrue chamando o método TryGetCurrentValue no nosso objeto result para converter o conteúdo em um objeto do tipo Car. A validação seguinte verifica se objeto car é de fato o registro que foi selecionado no Get(string model) do controller.

Os demais métodos de teste para cada ação do nosso controller seguem a mesma estrutura do exemplo mostrado acima. A diferença está no que está sendo validado. Pode ser um campo do objeto, pode ser a quantidade de registros retornados, ou até mesmo se o objeto é nulo. Acompanhe abaixo a classe de testes com todos os métodos.

namespace LuizPauloPradoBlog.WebApi.Tests
{
    [TestClass]
    public class CarControllerTest
    {
        private ICarRepository _repository;

        [TestInitialize]
        public void Initialize()
        {
            var carSamples = new List<Car>();
            carSamples.Add(new Car() { Name = "Fiesta", Model = "Fiesta SE", YearOfManufacture = 2015 });
            carSamples.Add(new Car() { Name = "Golf", Model = "Golf Sport", YearOfManufacture = 2015 });
            carSamples.Add(new Car() { Name = "Civic", Model = "Civic S", YearOfManufacture = 2016 });

            _repository = new CarRepository(carSamples);
        }

        [TestMethod]
        public void ShouldGetAllCars()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var result = controller.Get();

            IEnumerable<Car> cars;

            Assert.IsTrue(result.TryGetContentValue<IEnumerable<Car>>(out cars));
            Assert.IsNotNull(cars);
            Assert.AreEqual(3, cars.Count());
        }

        [TestMethod]
        public void ShouldGetCar()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var result = controller.Get("Fiesta SE");

            Car car;

            Assert.IsTrue(result.TryGetContentValue<Car>(out car));
            Assert.AreEqual(car.Model, "Fiesta SE");
        }

        [TestMethod]
        public void ShouldPostCar()
        {
            var controller = new CarController(_repository);
            controller.Request = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var newCar = new Car() { Name = "IX 35", Model = "IX 35 Special", YearOfManufacture = 2016 };

            var result = controller.Post(newCar);

            Car car;

            Assert.IsTrue(result.TryGetContentValue<Car>(out car));
            Assert.IsNotNull(car);
            Assert.AreEqual(car.Name, newCar.Name);
            Assert.AreEqual(car.Model, newCar.Model);
            Assert.AreEqual(car.YearOfManufacture, newCar.YearOfManufacture);
        }
    }
}

O último passo é executar todos os testes e conferir se tudo funcionou corretamente.

Captura de Tela 2016-06-07 às 18.19.49

O projeto completo de exemplo 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.

Aqui no blog também tem o artigo que explica como fazer esses mesmos testes em um projeto ASP.NET Web API 2 que retorna os dados em um IHttpActionResult.

Se ficou alguma dúvida, ou se algo não funcionou, deixa um comentário aqui no blog que esclareço as dúvidas.