C# 用最小起订量替换设置值
我在模拟一个C# 用最小起订量替换设置值,c#,entity-framework,entity-framework-6,moq,C#,Entity Framework,Entity Framework 6,Moq,我在模拟一个DbContext及其DbSets 我想创建一个实用方法来创建我的mockDbContexts,它设置每个上下文的DbSets,默认情况下返回一个空列表(否则每当我试图查询其中一个DbSets时,我就会得到关于空引用的错误)。然后,在单元测试中,我希望在某个DbSet中有非空数据,我想再次调用该DbSet上的Setup,以提供我想要返回的值。代码如下 我在一个单元测试中这样做了,它似乎起作用了,但我找不到关于Moq如何处理在同一属性上调用两次Setup的任何信息。这样做可以吗,还是会
DbContext
及其DbSet
s
我想创建一个实用方法来创建我的mockDbContext
s,它设置每个上下文的DbSet
s,默认情况下返回一个空列表(否则每当我试图查询其中一个DbSet
s时,我就会得到关于空引用的错误)。然后,在单元测试中,我希望在某个DbSet
中有非空数据,我想再次调用该DbSet
上的Setup
,以提供我想要返回的值。代码如下
我在一个单元测试中这样做了,它似乎起作用了,但我找不到关于Moq如何处理在同一属性上调用两次Setup
的任何信息。这样做可以吗,还是会产生意想不到的副作用?使用调试器,我查看了上下文。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 ...
}
}
[TestClass]
公共类MyTests
{
//在每个属性上创建一个新的模拟并调用安装程序,以便
//它们都返回空列表
私有模拟CreateContext()
{
Mock context=new Mock();
//CreateMockDbSet是一种实用方法,用于创建模拟
//如上面列出的MSDN文章所述
Setup(e=>e.Customers).Returns(CreateMockDbSet().Object);
Setup(e=>e.Orders).Returns(CreateMockDbSet().Object);
返回上下文;
}
[测试方法]
公共无效MyTest()
{
//默认情况下,context.Customers和context.Orders都将返回
//空数据库集
Mock context=CreateContext();
列表顺序=新列表
{
新顺序{Id=1},
新顺序{Id=2},
新顺序{Id=3}
};
//CreateMockDbSet创建一个返回订单的模拟
//在“订单”中。当我在“订单”上再次调用安装程序时,Moq做什么?
Setup(e=>e.Orders).Returns(CreateMockDbSet(Orders.Object);
//…做测试。。。
}
}
如果在方法上创建了一个后续设置,并且该设置是无条件的(对参数没有限制),那么它将删除该方法以前的所有设置 在您没有接受参数的方法的情况下,您显然无法对它们添加任何约束,因此后续设置将只替换以前的设置
有关源代码的解释,请参阅。如果将
context.Setup(e=>e.Customers).Returns(CreateMockDbSet().Object)
替换为包含CreateMockDbSet().Object的成员字段,只返回该值而不是在每次调用时创建新的数据集,会有帮助吗?我不确定你的意思是什么?我现在没有创建新的数据库;我只是将我的mockDbContext
配置为在每个测试中返回特定数据。这是一个输入错误。我的意思是数据集,而不是数据库。我想在每个单元测试中使用全新的DbContext
和DbSet
s,这样每个测试都是完全自封装的。太好了,这就是我希望它能做到的。谢谢你的回复。