Given a basic repository interface:
public interface IPersonRepository
{
void AddPerson(Person person);
List<Person> GetAllPeople();
}
With a basic implementation:
public class PersonRepository: IPersonRepository
{
public void AddPerson(Person person)
{
ObjectContext.AddObject(person);
}
public List<Person> GetAllPeople()
{
return ObjectSet.AsQueryable().ToList();
}
}
How can you unit test this in a meaningful way? Since it crosses the boundary and physically updates and reads from the database, thats not a unit test, its an integration test.
Or is it wrong to want to unit test this in the first place? Should I only have integration tests on the repository?
I’ve been googling the subject and blogs often say to make a stub that implements the IRepository:
public class PersonRepositoryTestStub: IPersonRepository
{
private List<Person> people = new List<Person>();
public void AddPerson(Person person)
{
people.Add(person);
}
public List<Person> GetAllPeople()
{
return people;
}
}
But that doesnt unit test PersonRepository, it tests the implementation of PersonRepositoryTestStub (not very helpful).
In this specific case I think you don’t need to make a unit test for your repository class, as the implementation is simply invoking the
ObjectContextobject, so it will be like testing something you didn’t build (which is not the idea). In case you don’t have any complex logic, my recommendation is not to waste time on making a unit test for that class. What you say about the PersonRepositoryTestStub is a fake implementation of the repository for testing the layer that is above of your DAL.