Menu / szukaj

Przyspieszanie AutoFixture

O bibliotece AutoFixture wspominałem już ostatnio we wpisie Lightning talk – Autofixture. Biblioteka ta pomaga nam w tworzeniu obiektów w trakcie fazy Arrange w testach jednostkowych. Dzięki niej możemy skupić się na tym co rzeczywiście ma zostać przetestowane, a nie na tworzeniu obiektów, które są potrzebne do przeprowadzenia testu. Dodatkowo chroni ona nas przed niepotrzebną modyfikacją testów w momencie zmiany wykorzystywanych w testach obiektów.

Ma ona drobną wadę, w zależności od obiektów, które tworzymy za jej pomocą może ona spowodować znaczące wydłużenie trwania testów jednostkowych. W szczególności, gdy za jej pomocą tworzymy obiekty związane z EntityFrameworkiem. Czytaj dalej

Mockowanie typów DbContext oraz DbSet z wykorzystaniem Moq

Pisząc testy jednostkowe w aplikacjach, które przechowują dane w bazie danych prędzej, czy później będziemy zmuszeni do odizolowania warstwy dostępu do bazy danych. W opisywanym przypadku jako ORM wykorzystywany jest Entity Framework.

Kod definiujący podstawowe elementy wygląda w następujący sposób:

public class User
{
  public int Id { get; set; }
  public string Login { get; set; }
  public string Name { get; set; }
  public string Surname { get; set; }
  public bool AccountLocked { get; set; }
  public virtual List<Role> Roles { get; set; }
}

public class UsersContext : DbContext
{
  public virtual DbSet<User> Users { get; set; }
  public virtual DbSet<Role> Roles { get; set; }
}

public class UsersService
{
  private readonly UsersContext usersContext;
  
  public UsersService(UsersContext usersContext)
  {
    this.usersContext = usersContext;
  }
 
  public User AddUser(string login, string name, string surname)
  {
    var newUser = this.usersContext.Users.Add(
      new User
      {
        Login = login,
        Name = name,
        Surname = surname,
        AccountLocked = false
      });
  
    this.usersContext.SaveChanges();
    return newUser;
  }
 
  public IList<User> GetLockedUsers ()
  {
    return this.usersContext.Users.Where(x => x.AccountLocked).ToList();
  }
}

Chcąc odizolować warstwę danych od aplikacji można wykorzystać jedną z dwóch opcji:

  • napisać dodatkową implementację klasy UsersContext, która na potrzeby testów jednostkowych będzie symulowała działanie bazy danych. Obiekt nowej klasy zostanie wstrzyknięty do obiektów, które do działania potrzebują klasę UsersContext.
  • wykorzystać jeden z dostępnych frameworków mockujących – w tym przypadku Moq.

Czytaj dalej

Ściągawka z Moq, AutoFixture oraz xUnit

Poniżej można pobrać ściągawkę związaną z pisaniem testów jednostkowych wykorzystujących technologie: Moq, AutoFixture oraz xUnit.

Moq - AutoFixture - xUnit - Ściągawka strona 1
Moq – AutoFixture – xUnit – Ściągawka strona 1
Moq - AutoFixture - xUnit - Ściągawka strona 2
Moq – AutoFixture – xUnit – Ściągawka strona 2

W głównej mierze powstała ona na podstawie dwóch opisów: Moq Quickstart oraz AutoFixture Cheat Sheet.

I najważniejsze – link do pobrania: Moq + xUnit + AutoFixture – Cheat sheet (Rozmiar: 500.61 kB, MD5: e74eff5b1d5bb3159d6070889502efe7).