Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用最小起订量替换设置值_C#_Entity Framework_Entity Framework 6_Moq - Fatal编程技术网

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

我想创建一个实用方法来创建我的mock
DbContext
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的成员字段,只返回该值而不是在每次调用时创建新的数据集,会有帮助吗?我不确定你的意思是什么?我现在没有创建新的数据库;我只是将我的mock
DbContext
配置为在每个测试中返回特定数据。这是一个输入错误。我的意思是数据集,而不是数据库。我想在每个单元测试中使用全新的
DbContext
DbSet
s,这样每个测试都是完全自封装的。太好了,这就是我希望它能做到的。谢谢你的回复。