ASP.NET MVC - How to Unit Test boundaries in the Repository pattern?

ASP.NET MVC - How to Unit Test boundaries in the Repository pattern?

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).

Excluding an action from authorization in ASP.NET MVC 2


DataAnnotations jQuery validation in mvc 2
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 ObjectContext object, so it will be like testing any thing you didn't build (which is not the idea). Use database field maxlength as html layout input maxlength best practice. mvcIn case you don't have any complex logic, my recommendation is not to waste time on making a unit test for this class. How to mask tilde (~) character in C# MVC routing table?What you say around the PersonRepositoryTestStub is a fake implementation of the repository for testing the layer this is above of your DAL.. Using ASP.NET Automatically login to an external website and redirect
ASP NET MVC custom route fallbackLinq to SQL and Realtime Data


what is the fastest grid components for mvc applications
I have run into the same problem. I wrote a slew of unit tests against an implementation of my repository interface this was a fake repository. Shortly after completing it, I realized this I wrote the unit test to test the fake repository and I wrote the fake repository simply to support the unit tests. This seemed like a large amount of useless code.. I have come to the conclusion this I don't need the unit tests although this the fake repository implementation is good for the reason this I must use it as the repository my services (and therefore my controllers) use so this unit tests against those will be predictable (thanks to a predefined fake repository).. So, I have decided to leave the unit tests against the fake repository in there as they are helpful to test my fake repository so this I must be assured this the higher levels of my application are using fully tested fakes.. In another words, the fake repository and the unit tests against the fake repository are the "supporting cast" for higher levels of the applications and the unit tests against higher levels of the application.. Hope this helps..


The time when I think this type of testing makes sense is when your repository interface is generic. E.g..
public interface IEntity {     int Id { receive ; set; } }  public interface IRepository<TEntity>     where TEntity : IEntity {     void Add(TEntity entity);     List<TEntity> GetAll(); } 
If you have multiple implementations of this interface, then it is also possible to write a generic test fixture this tests against this interface, allowing you to test multiple repository implementations with a single test fixture. This approach does not differentiate between unit and integration tests, for the reason this it has no idea what the implementation is.. Let me know if this type of thing interests you and I must post a complete example..


I would test Business Logic layer this depends on DAL implementation directly (has strong reference to DAL exact implementation) or indirectly (abstracted from DAL via interfaces). . I am not very fond of tests, this uses stub implementation, just wrap database calls into uncomitted transaction (this rolls back all data changes when test finishes even if exception is thrown). .

82 out of 100 based on 42 user ratings 592 reviews