[英]Replacing the value of Setup with Moq
我正在DbContext
一个DbContext
及其DbSet
,如here所述。
我想创建一个实用方法来创建我的模拟DbContext
s,它设置每个上下文的DbSet
s 默认情况下返回一个空列表(否则,每当我尝试查询DbSet
s 之一时,我都会收到有关空引用的错误)。 然后在我想要某个DbSet
中的非空数据的单元测试中,我想在该DbSet
上再次调用Setup
以提供比我想要返回的值。 代码如下。
我在单元测试中做了这个,它似乎有效,但我找不到任何关于 Moq 如何处理在同一属性上调用Setup
任何信息。 这样做可以吗,还是会产生意想不到的副作用? 使用调试器,我查看了context.Setups
,并在同一属性上第二次调用Setup
将第二个对象添加到Setups
而不是覆盖第一个对象,这让我很担心。
[TestClass]
public class MyTests
{
// Creates a new Mock<MyContext> and calls Setup on each property so
// that they all return empty lists
private Mock<MyContext> CreateContext()
{
Mock<MyContext> context = new Mock<MyContext>();
// CreateMockDbSet is a utility method which creates a Mock<DbSet<TEntity>>
// as described in the MSDN article listed above
context.Setup(e => e.Customers).Returns(CreateMockDbSet<Customer>().Object);
context.Setup(e => e.Orders).Returns(CreateMockDbSet<Order>().Object);
return context;
}
[TestMethod]
public void MyTest()
{
// By default, context.Customers and context.Orders will both return
// empty DbSets
Mock<MyContext> context = CreateContext();
List<Order> orders = new List<Order>
{
new Order { Id = 1 },
new Order { Id = 2 },
new Order { Id = 3 }
};
// CreateMockDbSet creates a Mock<DbSet<Order>> which returns the orders
// in 'orders'. What does Moq do when I call Setup again on 'Orders'?
context.Setup(e => e.Orders).Returns(CreateMockDbSet(orders).Object);
// ... Do test ...
}
}
https://msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
如果您在方法上创建后续设置并且它是无条件的(对参数没有约束),那么它会删除该方法的所有先前设置。
在您没有接受参数的方法的情况下,您显然无法对它们添加任何约束,因此您的后续设置将替换之前的设置。
有关源代码的解释,请参阅此答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.