Esta dúvida é originada de outro post aqui mesmo no .Net Architects. Resolvi criar outra thread com foco apenas nesta questão.
Publiquei também no meu twitter sobre como/onde testar métodos do repositório.
Vamos a seguinte situação: Eu tenho uma interface IRepository como esta:
public interface IRepository<T>
where T: class, IEntity
{
IQueryable<T> Query(Expression<Func<T, bool>> expression);
// ... Omitido
}E uma implementação genérica do meu 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();
}
}Esta é uma implementação base e pode ser usada por qualquer repositório. Ela contém a implementação básica do meu ORM.
Alguns repositórios tem filtros específicos, neste caso teremos o IEmployeeRepository com um filtro específico:
public interface IEmployeeRepository : IRepository<Employee>
{
IQueryable<Employee> GetInactiveEmployees();
}E a implementação da interface 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);
}
}É corretor herdar de Repository<Employee>?
O objetivo é reaproveitar código uma vez que toda a implementação de IRepository já foi feita. Se EmployeeRepositoryherdar apenas de IEmployeeRepository, terei de literalmente copiar e colar o código de Repository<T>.
Neste nosso exemplo, em EmployeeRepository : Repository<Employee> o nosso Repository se encontra em nossa camada ORM. Ou seja, temos uma dependência aqui com o nosso ORM impossibilitando de realizar algum teste unitário.
Como criar um teste unitário para garantir que o filtro GetInactiveEmployees retorne todos os Employees em que o Status != Active e StartDate < Data atual. Não posso criar um Fake/Mock de IEmployeeRepository porque o que eu estaria testando? Preciso testar a implementação real de GetInactiveEmployees.
O código completo encontra-se no Github
Web Developer | MCPD Certify
Skype.: 4042-6002 | Cel.: (31) 8681-1986
bindsolution.comMicrosoft Parner Network
Edmilson, esqueci de comentar mas não tenho como chamar EmployeeRepository.Store(obj) porque no meu projeto de testes unitários não existe uma referência ao ORM.
Store fica em no repositório genérico Repository<T> com uma referência ao NHibernate.