Recentemente ha avuto dubbi su come e dove testare i metodi di repository.
Lascia che la seguente situazione: Ho un'interfaccia IRepository
come questa:
public interface IRepository<T>
where T: class, IEntity
{
IQueryable<T> Query(Expression<Func<T, bool>> expression);
// ... Omitted
}
E un'implementazione generica di IRepository
public class Repository<T> : IRepository<T>
where T : class, IEntity
{
public IQueryable<T> Query(Expression<Func<T, bool>> expression)
{
return All().Where(expression).AsQueryable();
}
}
Questa è una base di implementazione che può essere utilizzata da qualsiasi repository. Contiene l'implementazione di base di my ORM .
Alcuni repository hanno filtri specifici, nel qual caso avremo IEmployeeRepository
con un filtro specifico:
public interface IEmployeeRepository : IRepository<Employee>
{
IQueryable<Employee> GetInactiveEmployees();
}
E l'implementazione di IEmployeeRepository
:
public class EmployeeRepository : Repository<Employee>, IEmployeeRepository // TODO: I have a dependency with ORM at this point in Repository<Employee>. How to solve? How to test the GetInactiveEmployees method
{
public IQueryable<Employee> GetInactiveEmployees()
{
return Query(p => p.Status != StatusEmployeeEnum.Active || p.StartDate < DateTime.Now);
}
}
Domande
-
È giusto ereditare
Repository<Employee>
?
L'obiettivo è riutilizzare il codice una volta che sono state già eseguite tutte le implementazioni diIRepository
. SeEmployeeRepository
eredita soloIEmployeeRepository
, devo letteralmente copiare e incollare il codice diRepository<T>
. -
Nel nostro esempio, in
EmployeeRepository : Repository<Employee>
la nostraRepository
si trova nel nostro livello ORM. Abbiamo una dipendenza qui con il nostro ORM impossibile eseguire alcuni test di unità . -
Come creare un unit test per garantire che il filtro
GetInactiveEmployees
restituisca tutti i Dipendenti in cui Status! = Active e StartDate < DateTime.Now. Non riesco a creare un falso / Mock diIEmployeeRepository
perché vorrei testare? È necessario testare l'effettiva implementazione diGetInactiveEmployees
.
Il codice completo può essere trovato su Github