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