我的存储库中有以下方法
public IQueryable<T> QueryWithInclude(String include)
{
return _dbSet.Include(include);
}
我如何模拟我使用Moq的这种方法。我似乎无法找到正确的方法。
例如
我可以做以下事情public IQueryable<T> Query()
{
return _dbSet;
}
mockrepository.Setup(_ => _.Query()).Returns(foo.AsQueryable());
另外,如果这种方法的模拟最终变得困难,那么考虑替代实现/解决方法是明智的吗?
答案 0 :(得分:3)
只要您的抽象返回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有强烈的意见。如果你还没有看到它们,可能值得一试。