2013-02-18 3 views
1

для модульного тестирования моего asp.net MVC-веб-приложения, я хотел бы высмеять мой IGenericRepository (я использую Moq).Отказывание общего метода репозитория

Метод, который должен быть издевались выглядит так:

IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = ""); 

Я уже высмеял хранилище без каких-либо проблем:

useraccountRepository = new Mock<IGenericRepository<Useraccount>>(); 

Теперь я хотел бы сказать, что когда Moq вызывается метод Get моего интерфейса, должен быть возвращен список пользовательских учетных записей:

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email && u.Password == useraccount.Password)).Returns(useraccounts); 

I thi nk есть ошибка в моей второй лямбда, потому что эта работа работает:

useraccountRepository.Setup(r => r.Get(null, null, "")).Returns(useraccounts); 

Но где моя ошибка?

Что работает:

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email 
      && u.Password == useraccount.Password, null, "")).Returns(useraccounts); 

Похоже значений параметра по умолчанию не применяются в моей издеваться. Почему это?

Если я использую

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email 
      && u.Password == useraccount.Password, null, "")).Returns(useraccounts); 

в любом случае, то метод в мой контроллер генерирует исключение, когда Get сообщение называется:

private bool validateUser(Useraccount useraccount) 
    { 
     try 
     { 
      Useraccount useraccountLogin = UnitOfWork.UseraccountRepository.Get(
       u => u.Email == useraccount.Email && u.Password == useraccount.Password).Single<Useraccount>(); 

      return (useraccountLogin != null); 
     } 
     catch (Exception exc) 
     { 
      return false; 
     }    
    } 

Где мои ошибки?

Заранее спасибо. Michael

+0

** Что ** не работает и ** которое ** исключение выбрано? Вы ориентируетесь по специфике, как профи ... –

+0

Извините за то, что вы сбиваете с толку. Если внутри моего модуля проверяется метод validateUser (...) - метод (изнутри метода контроллера), он генерирует исключение, в котором вызывается UseraccountRepository.Get (...): [System.InvalidOperationException] = {" Последовательность не содержит элементов"}. "в System.Linq.Enumerable.Single [TSource] (источник IEnumerable1) \ r \ n at ...". – mosquito87

ответ

0

В соответствии с этим вопросом Moq.Mock<T> - how to setup a method that takes an expression ограничение установки параметров выражения не поддерживается Moq.

+0

То, что я нашел и, по крайней мере, работает: useraccountRepository.Setup (r => r.Get (It.IsAny >>(), null, "")). (учетные записи пользователей); Есть ли лучший способ или это лучший способ издеваться над методом репозитория, который я показал? – mosquito87

+0

Я думаю, что это ваш лучший выбор. Но, очевидно, у вас есть проблема, когда вам нужно издеваться над двумя разными вызовами с разными выражениями. Я бы подумал об отказе от общего репо. Многие эксперты считают это антипаттером, отчасти из-за плохой проверяемости. –

+0

Благодарим вас за помощь. Ваша ссылка взяла меня на правильный путь. :) – mosquito87

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