C# 使用Moq设置Query()方法

C# 使用Moq设置Query()方法,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,我的代码设置在。我正在尝试测试一个方法,该方法应该仅在请求时加载一些相关集合,它还根据定义的参数过滤掉一些数据。如果排除用于设置对象计数属性的以下代码,则测试通过: 班级 public class Foo { public int Id {get; set;} public ICollection<Bar> Bars {get; set;} public int Count {get; set} } public class Bar { p

我的代码设置在。我正在尝试测试一个方法,该方法应该仅在请求时加载一些相关集合,它还根据定义的参数过滤掉一些数据。如果排除用于设置对象计数属性的以下代码,则测试通过:

班级

 public class Foo
 {
    public int Id {get; set;}
    public ICollection<Bar> Bars {get; set;}
    public int Count {get; set}
 }

 public class Bar
 {
    public int Id {get; set;}
    public string Name {get; set;}
    // ...
 }
公共类Foo
{
公共int Id{get;set;}
公共ICollection条{get;set;}
公共整数计数{get;set}
}
公共类酒吧
{
公共int Id{get;set;}
公共字符串名称{get;set;}
// ...
}
DbContext

 ..
  public virtual DbSet<Foo> Foo {get;set;}
 ..
。。
公共虚拟数据库集Foo{get;set;}
..
回购

公共列表GetFoo(bool loadBar=false) { IEnumerable foos=Context.Foo.AsEnumerable(); foreach(Foo-f-in-foos) { // ... if(加载条) { Context.Entry(foo.Collection)(c=>c.bar.Load(); } foo.Count=Context.Entry(foo) .收集(c=>c.bar) .Query()//c.Foo) .Returns(fooMockSet.Object); 使用(回购) { List foos=repo.GetFoo(); } } 公共模拟MockDbSet(列表数据),其中T:class { var queryable=data.AsQueryable(); var dbSet=new Mock(); dbSet.As().Setup(m=>m.Provider).Returns(queryable.Provider); 设置(m=>m.Expression).Returns(queryable.Expression); 设置(m=>m.ElementType).Returns(queryable.ElementType); dbSet.As().Setup(m=>m.GetEnumerator())。返回(()=>queryable.GetEnumerator()); 返回dbSet; } 当我运行代码时,这可以正常工作,但我的模拟无法正确设置,因为我收到以下异常:

System.InvalidOperationException:无法为属性“CollectionToCount”调用成员“Query”,因为类型为{'ParentType'}的实体 在上下文中不存在

我如何设置Moq使其工作?目前为止我已经有了这个,但我不确定它应该返回什么:

mockContext.Setup(x =>
x.Entry(It.IsAny<T>())
.Collection(c => c.CollectionToCount))
.Returns(???);
mockContext.Setup(x=>
x、 条目(It.IsAny())
.Collection(c=>c.CollectionToCount))
.返回(??);

目前没有提供足够的信息。请提供一个可用于重现问题的方法。这将有助于确定原因,并有助于制定解决方案。您好,我尝试尽可能简洁,因为我的代码与模拟发布的代码不同。我只想能够模拟对相关集合的查询方法的调用。并不总是加载集合,而是加载集合中的项目计数(entity.CountProperty)无论是否加载集合,都应始终包含该值。这是可行的,但在测试期间模拟数据时不行。我添加了更多信息,这几乎就是我的设置方式。
 [TestMethod]
 public void Test()
 {
     Mock<DbContext> mockContext = new Mock<DbContext>();
     Mock<DbSet<Foo>> fooMockSet = MockDbSet(new FooWithAtLeast1BarInCollection());

     mockContext.Setup(c => c.Foo)
        .Returns(fooMockSet.Object);

    using(repo)
    {
      List<Foo> foos = repo.GetFoo();
    }

 }

 public Mock<DbSet<T>> MockDbSet<T>(List<T> data) where T : class
{
    var queryable = data.AsQueryable();

    var dbSet = new Mock<DbSet<T>>();
    dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
    dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
    dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
    dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());

    return dbSet;
}
mockContext.Setup(x =>
x.Entry(It.IsAny<T>())
.Collection(c => c.CollectionToCount))
.Returns(???);