我正在 mock DbContext
及其 DbSet
as described here 。
我想创建一个实用方法来创建我的模拟 DbContext
,它将每个上下文的 DbSet
设置为默认返回一个空列表(否则,每当我尝试查询 DbSet 之一时,我都会收到有关空引用的错误。然后,在单元测试中,我希望某个 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
最佳答案
如果您在方法上创建后续设置并且它是无条件的(对参数没有限制),那么它将删除该方法的所有先前设置。
如果您没有接受参数的方法,那么您显然无法对它们添加任何约束,因此您的后续设置将替换之前的设置。
参见this answer获取源代码的解释。
关于c# - 用 Moq 替换 Setup 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625241/