2015-09-18 4 views
2

Я действительно борется с тем, чтобы это работало. У меня есть общий шаблон репозитория, и мне нужно заглушить интерфейс репозитория с помощью Microsoft Fakes.Интерфейс-заглушка с общими методами, которые принимают предикаты

public interface IDataAccess<T> where T : class 
{ 
    void Add(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
    void Delete(Expression<Func<T, bool>> where); 
    T FindById(long id); 
    T FindById(string id); 
    T Find(Expression<Func<T, bool>> where); 
    IEnumerable<T> FindAll(); 
    IEnumerable<T> FindMany(Expression<Func<T, bool>> where); 
    IQueryable<T> Find(Expression<Func<T, bool>> predicate = null, params Expression<Func<T, object>>[] includes); 
    IQueryable<T> FindIncluding(params Expression<Func<T, object>>[] includeProperties); 
} 

пытается создать заглушки для

IQueryable<T> Find(Expression<Func<T, bool>> predicate = null, params Expression<Func<T, object>>[] includes); 
IQueryable<T> FindIncluding(params Expression<Func<T, object>>[] includeProperties); 

и в моем тесте ..

IDataAccess<EnterprisePermissionSet> dataAccess = new HG.Fus.Authentication.Data.Fakes. 
      StubIDataAccess<EnterprisePermissionSet>() 
     { 
      FindIncludingExpressionOfFuncOfT0ObjectArray =() => { }; 
     }; 

Я просто понятия не имеют, как построить этот окурок,

+0

Вы должны моделировать поведение, которое вы ищете внутри '{}' –

+0

Вот что я делал в первом, но получаю сообщение об ошибке, что я не может преобразовать исходный тип «Lambda Expression» в целевой тип «IQueryable » – JBeckton

+0

ok, прочитайте мой ответ, я покажу, как заглушить эти методы ... –

ответ

0

MsFakes использования генерация кода для замены на поддельные методы, создание заглушек и т. д. To r вместо определенного метода вам необходимо установить новый метод (Action или Func на основе подписи метода), который получит любой вызов этого конкретного метода.

Сигнатура метода, который вы хотите подделкой является:

IQueryable<T> FindIncluding(params Expression<Func<T, object>>[] includeProperties); 

На основе этой подписи вы должны установить Func, который получает массив Expression<Func<T, object>> и возвращает IQueryable<T>. Следующий фрагмент кода показывает простой пример, чтобы заменить вышеупомянутый метод:

fakeDataAccess.FindIncludingExpressionOfFuncOfT0ObjectArray = expressions => 
{ 
    // here you can create the logic/fill the return value and etc... 
    return new List<EnterprisePermissionSet>().AsQueryable(); \\this example is match your T 
}; 

Самый простой способ для имитации IQueryable<T> является возвращение коллекции через AsQueryable(), другой способ заключается в использовании EnumerableQuery класса.

Вот пример замены: IQueryable<T> Find(Expression<Func<T, bool>> predicate = null, params Expression<Func<T, object>>[] includes);

fakeDataAccess.FindExpressionOfFuncOfT0BooleanExpressionOfFuncOfT0ObjectArray = 
(expression, expressions) => 
    { 
      // here you can create the logic/fill the return value and etc... 
      return new List<EnterprisePermissionSet>().AsQueryable(); 
    }; 
Смежные вопросы