繁体   English   中英

如何模拟包含DbSet的方法?

[英]How to mock Include method of DbSet?

我的存储库中有以下方法

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

我怎么能模仿我使用Moq这样的方法。 我似乎无法找到正确的方法。

例如,我可以做以下事情

public IQueryable<T> Query()
            {
                return _dbSet;
            }

mockrepository.Setup(_ => _.Query()).Returns(foo.AsQueryable()); 

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

只要你的抽象返回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将不执行任何操作。

我必须补充说,对于为什么它很糟糕而且毫无价值来嘲笑EntityFramework有强烈的意见。 如果您还没有看到它们,那么检查它们可能是值得的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM