gpt4 book ai didi

c# - 如何模拟DbSet的Include方法?

转载 作者:行者123 更新时间:2023-11-30 12:12:02 28 4
gpt4 key购买 nike

我的存储库中有以下方法

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 是不好的和毫无值(value)的,有很多强烈的意见。如果您还没有看到它们,可能值得一试。

关于c# - 如何模拟DbSet的Include方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14302150/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com