使用带有谓词的通用方法的Stub接口

时间:2015-09-18 21:18:55

标签: c# lambda microsoft-fakes

我真的很努力让这个工作。我有一个通用的存储库模式,我需要使用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 = () => { };
        };

我根本不知道如何构建这个存根,

1 个答案:

答案 0 :(得分:0)

MsFakes使用代码生成来替换伪方法,创建存根等... 要替换特定方法,您必须设置基于方法签名的新方法(ActionFunc),该方法将接收对此特定方法的任何调用。

您想伪造的方法的签名是:

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