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(???);