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. SeEmployeeRepositoryeredita soloIEmployeeRepository, devo letteralmente copiare e incollare il codice diRepository<T>. -
Nel nostro esempio, in
EmployeeRepository : Repository<Employee>la nostraRepositorysi 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
GetInactiveEmployeesrestituisca tutti i Dipendenti in cui Status! = Active e StartDate < DateTime.Now. Non riesco a creare un falso / Mock diIEmployeeRepositoryperché vorrei testare? È necessario testare l'effettiva implementazione diGetInactiveEmployees.
Il codice completo può essere trovato su Github