Iam writing unit tests for my repository and I need to test repository method with delegate.
First of all part from repository interface
public interface IRepository<T>
{
...
IQueryable<T> All();
...
}
and here is the method what I want to test. I do it as an extension method for IRepository<RentDetails>
public static bool AnyIntersectionForRoomWithDatesExists
(this IRepository<RentDetails> repository, Room room, DateTime startDate,
DateTime terminationDate)
{
var rent = repository.All().Where(
r =>
(r.BeginningDate <= startDate && r.TerminationDate > terminationDate &&
r.TerminationDate < terminationDate) ||
(r.BeginningDate > startDate) ||
(r.TerminationDate >= terminationDate && r.BeginningDate > startDate &&
r.BeginningDate < terminationDate));
}
In my unit tests I created an IEnumerable<RentDetails> collection
IEnumerable<RentDetails> rentDetailsColection = new List<RentDetails>
{
new RentDetails(TenantTestHelper.ValidTenant,roomMoq, new DateTime(2012, 1, 1),new DateTime(2012, 2, 1)),
new RentDetails(TenantTestHelper.ValidTenant,roomMoq, new DateTime(2012, 3, 1),new DateTime(2012, 7, 1)),
new RentDetails(TenantTestHelper.ValidTenant,roomMoq, new DateTime(2012, 10, 1),DateTime.MaxValue)
};
but I have a problem how to setup the repository moq? I tryed the following
[Test]
var reqestStartDate = new DateTime(2012, 4, 1);
var requestTerminationDate = reqestStartDate.AddDays(30);
...
rentDetailsRepositoryMoq.Setup(c => c.All().Where(r =>
(r.BeginningDate <= reqestStartDate &&
r.TerminationDate > requestTerminationDate &&
r.TerminationDate < requestTerminationDate) ||
(r.BeginningDate > reqestStartDate) ||
(r.TerminationDate >= requestTerminationDate &&
r.BeginningDate > reqestStartDate &&
r.BeginningDate < requestTerminationDate)))
.Returns((IQueryable<RentDetails>)rentDetailsColection
.Where(r =>(r.BeginningDate <= reqestStartDate &&
r.TerminationDate > requestTerminationDate &&
r.TerminationDate < requestTerminationDate) ||
(r.BeginningDate > reqestStartDate) ||
(r.TerminationDate >= requestTerminationDate &&
r.BeginningDate > reqestStartDate && r.BeginningDate < requestTerminationDate)));
but I have got an exception
NotSupportedException
Expression references a method that does not belong to the mocked object: c => c.All().Where(r => (((r.BeginningDate <= .reqestStartDate && r.TerminationDate > .requestTerminationDate) && r.TerminationDate < .requestTerminationDate) || r.BeginningDate > .reqestStartDate) || ((r.TerminationDate >= .requestTerminationDate && r.BeginningDate > .reqestStartDate) && r.BeginningDate < .requestTerminationDate))
Just
SetuptheIRepository.All()to return aIQueryable<T>and assert that the unit under test is doing what it is supposed to be doing. Note that by conventional definitions, you are trying to Stub the repository and you will be asserting the state.