最小起订量未解析 ICollection 参考
Moq not resolving ICollection reference
我正在使用 Moq.4.2.1507.0118,我遇到了一个以前从未见过的问题。情况是我的模型(A 和 B)中有两个 类 具有一对多关系。例如:
[Table("A")]
public partial class A
{
public A()
{
this.theB = new HashSet<B>();
}
[Key]
public int AId{ get; set; }
public string Name{ get; set; }
public virtual ICollection<B> theB{ get; set; }
}
[Table("B")]
public partial class B
{
[Key]
public int BId{ get; set; }
public int AId{ get; set; }
public virtual A theA { get; set; }
}
当然我也在 DbContext 中定义了 DbSet。
然后,在我的测试代码中,我有:
[TestMethod]
public void SomeTest()
{
var theAs = new List<A>
{
new A{ AId=1, Name="test" }
};
var theBs= new List<B>
{
new B{ BId=1, AId=1, theA=theAs[0] }
};
var ASet= new Mock<DbSet<A>>().SetupData(theAs);
var BSet= new Mock<DbSet<B>>().SetupData(theBs);
var context = new Mock<MyContext>();
context.Setup(s => s.A).Returns(ASet.Object);
context.Setup(s => s.B).Returns(BSet.Object);
var m = new ClassThatImTesting(context);
m.someMethod("test");
}
通常我会看到这足以让 A 和 B 在模拟上下文中相互了解。但是,在我测试的方法中,如果我 运行 是这样的:
var result = context.A.Where(x => x.theB.Count() > 0).FirstOrDefault();
我得到空值。由于我已经在许多其他测试中毫无问题地完成了此操作,因此我很难看到我做了什么来解决这个问题。任何想法都会有所帮助!我从我的实际代码中简化了这个例子,所以请原谅语法错误。
在将上下文注入 class 之前,您需要将集合实例化为 A 对象。
[TestMethod]
public void SomeTest()
{
var theAs = new List<A>
{
new A{ AId=1, Name="test" }
};
var theBs= new List<B>
{
new B{ BId=1, AId=1, theA=theAs[0] }
};
//here
theAs[0].theB = theBs
var ASet= new Mock<DbSet<A>>().SetupData(theAs);
var BSet= new Mock<DbSet<B>>().SetupData(theBs);
var context = new Mock<MyContext>();
context.Setup(s => s.A).Returns(ASet.Object);
context.Setup(s => s.B).Returns(BSet.Object);
var m = new ClassThatImTesting(context);
m.someMethod("test");
}
我正在使用 Moq.4.2.1507.0118,我遇到了一个以前从未见过的问题。情况是我的模型(A 和 B)中有两个 类 具有一对多关系。例如:
[Table("A")]
public partial class A
{
public A()
{
this.theB = new HashSet<B>();
}
[Key]
public int AId{ get; set; }
public string Name{ get; set; }
public virtual ICollection<B> theB{ get; set; }
}
[Table("B")]
public partial class B
{
[Key]
public int BId{ get; set; }
public int AId{ get; set; }
public virtual A theA { get; set; }
}
当然我也在 DbContext 中定义了 DbSet。
然后,在我的测试代码中,我有:
[TestMethod]
public void SomeTest()
{
var theAs = new List<A>
{
new A{ AId=1, Name="test" }
};
var theBs= new List<B>
{
new B{ BId=1, AId=1, theA=theAs[0] }
};
var ASet= new Mock<DbSet<A>>().SetupData(theAs);
var BSet= new Mock<DbSet<B>>().SetupData(theBs);
var context = new Mock<MyContext>();
context.Setup(s => s.A).Returns(ASet.Object);
context.Setup(s => s.B).Returns(BSet.Object);
var m = new ClassThatImTesting(context);
m.someMethod("test");
}
通常我会看到这足以让 A 和 B 在模拟上下文中相互了解。但是,在我测试的方法中,如果我 运行 是这样的:
var result = context.A.Where(x => x.theB.Count() > 0).FirstOrDefault();
我得到空值。由于我已经在许多其他测试中毫无问题地完成了此操作,因此我很难看到我做了什么来解决这个问题。任何想法都会有所帮助!我从我的实际代码中简化了这个例子,所以请原谅语法错误。
在将上下文注入 class 之前,您需要将集合实例化为 A 对象。
[TestMethod]
public void SomeTest()
{
var theAs = new List<A>
{
new A{ AId=1, Name="test" }
};
var theBs= new List<B>
{
new B{ BId=1, AId=1, theA=theAs[0] }
};
//here
theAs[0].theB = theBs
var ASet= new Mock<DbSet<A>>().SetupData(theAs);
var BSet= new Mock<DbSet<B>>().SetupData(theBs);
var context = new Mock<MyContext>();
context.Setup(s => s.A).Returns(ASet.Object);
context.Setup(s => s.B).Returns(BSet.Object);
var m = new ClassThatImTesting(context);
m.someMethod("test");
}