具有采用谓词的通用方法的存根接口

Stub interface with generic methods that take predicates

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

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

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

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

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

基于此签名,您必须设置一个 Func,它获得一个 Expression<Func<T, object>> 和 return 的数组 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()return一个集合,另一种方法是使用EnumerableQueryclass.

这里是要替换的例子: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();
     };