IXRepository e problemi di test

1

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

  1. È giusto ereditare Repository<Employee> ?
    L'obiettivo è riutilizzare il codice una volta che sono state già eseguite tutte le implementazioni di IRepository . Se EmployeeRepository eredita solo IEmployeeRepository , devo letteralmente copiare e incollare il codice di Repository<T> .

  2. Nel nostro esempio, in EmployeeRepository : Repository<Employee> la nostra Repository si trova nel nostro livello ORM. Abbiamo una dipendenza qui con il nostro ORM impossibile eseguire alcuni test di unità .

  3. 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 di IEmployeeRepository perché vorrei testare? È necessario testare l'effettiva implementazione di GetInactiveEmployees .

Il codice completo può essere trovato su Github

    
posta ridermansb 11.06.2013 - 03:11
fonte

1 risposta

1
  1. Questo mi sembra una relazione di tipo "ha-a", dal momento che menzionando questa classe agisce da filtro. Quindi piuttosto che ereditarlo dovrebbe avere un campo IRepository<Employee> privato che può ricevere quando viene costruito EmployeeRepository .

  2. Avere la possibilità di fornire un IRepository<Employee> ti permetterebbe di deridere / fingere e separare i dubbi sui test.

  3. Sì, non è necessario creare un oggetto fittizio della cosa che stai testando. Devi solo essere in grado di isolare il comportamento del metodo fornendo oggetti ideali per l'oggetto che stai testando per manipolare.

risposta data 12.06.2013 - 19:58
fonte

Leggi altre domande sui tag