2012-03-03 2 views
2

IAM-тесты для моего репозитория, и мне нужно протестировать метод репозитория с делегатом.Тестовый запрос репозитория с moq

Прежде всего часть из интерфейса хранилища

public interface IRepository<T> 
{ 
    ... 
    IQueryable<T> All(); 
    ... 
} 

и вот метод, что я хочу, чтобы проверить. Я делаю это как метод расширения для 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)); 
     } 

В моих модульных тестах я создал IEnumerable<RentDetails> коллекции

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) 
}; 

, но у меня есть для установки в хранилище MOQ проблемы как? Я судимое следующий

[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))); 

, но я получил за исключением

NotSupportedException 

Выражение ссылается на метод, который не принадлежит к издевались объекта:. С => c.All() Где (г => (((r.BeginningDate < = .reqestStartDate & & r.TerminationDate> .requestTerminationDate) & & r.TerminationDate < .requestTerminationDate) || r.BeginningDate> .reqestStartDate) || ((r.Termi nationDate> = .requestTerminationDate & & r.BeginningDate> .reqestStartDate) & & r.BeginningDate < .requestTerminationDate))

+0

Редактируйте свой код и добавьте разрывы строк, чтобы он не имел горизонтального прокрутки. Весь этот код трудно читать. – gideon

+1

Я бы запустил All(), чтобы просто вернуть список поддельных данных, преобразованных в IQueryable() (например, .Returns (rentDetailsColection.ToQueryable())). Если вам нужно перепрыгнуть через обручи, чтобы настроить модульные тесты, как вы делаете, что-то происходит неправильно. Я бы не стал проверять, вызывает ли метод все эти методы в источнике данных. Это утомительно и заставит вас прекратить тестирование в полном объеме, потому что слишком много работы для поддержания. –

+1

(продолжение): Если вы настроили тест, как я предлагаю, вам нужно будет только проверить результат метода. Если весь метод возвращает результат вызова в репозиторий, нет необходимости тестировать метод. Проверьте методы IQueryable, которые вместо этого вернут репозиторий. Если он вернет то, что возвращает ваш ORM (например, EF), не тестируйте его вообще. Это вне кода вашего приложения. –

ответ

4

Просто SetupIRepository.All() вернуть IQueryable<T> и утверждать, что испытываемое устройство делает то, что он является предположительно. Обратите внимание, что с помощью обычных определений вы пытаетесь заблокировать репозиторий, и вы будете утверждать состояние.

+0

Это способ сделать это. Я стараюсь хранить FakeRepository : IRepository в моем модульном тестовом проекте, поэтому мне нужно сделать это только один раз. Он принимает Hashset в конструкторе, поэтому делает его тривиальным для написания тестов. – Frans

Смежные вопросы