如何模拟DbSet的Include方法

本文关键字:DbSet Include 方法 模拟 何模拟 | 更新日期: 2023-09-27 17:52:17

我的存储库中有以下方法

public IQueryable<T> QueryWithInclude(String include)
        {
            return _dbSet.Include(include);
        }

我如何模拟这样的方法,我正在使用Moq。我似乎找不到正确的方法。

例如,我可以对 执行以下操作
public IQueryable<T> Query()
            {
                return _dbSet;
            }
mockrepository.Setup(_ => _.Query()).Returns(foo.AsQueryable()); 

而且,如果模拟这样的方法最终变得困难,那么考虑替代实现/变通方法是否明智?

如何模拟DbSet的Include方法

只要您的抽象返回IQueryable(如DbSet),那么您可以创建自己的Include扩展到IQueryable。您的代码将自动调用新的Include扩展方法。当在返回DbQuery的抽象上使用时,它将调用正确的invoke,否则如果它是IQueryable实例,它将不做任何事情。添加这个新的扩展方法意味着您当前的代码应该在没有任何更改的情况下编译

就像这样:

    /// see: http://msdn.microsoft.com/en-us/library/ff714955.aspx
    ///     
    /// The method has been modified from version that appears in the referenced article to support DbContext in EF 4.1 ->
    /// 
    /// </summary>
    public static class ModelExtensions {
        public static IQueryable<T> Include<T>
                (this IQueryable<T> sequence, string path) where T : class {
            var dbQuery = sequence as DbQuery<T>;
            if (dbQuery != null) {
                return dbQuery.Include(path);
            }
            return sequence;
        }
    }

所以如果你的单元测试使用一个假的IQueryable列表,Include将不做任何事情。

我必须补充,尽管有强烈的意见,为什么它是坏的和毫无价值的模拟实体框架。如果你还没看过,不妨去看看。