c# - 用 Moq 替换 Setup 的值

标签 c# entity-framework entity-framework-6 moq

我正在 mock DbContext 及其 DbSet as described here

我想创建一个实用方法来创建我的模拟 DbContext,它将每个上下文的 DbSet 设置为默认返回一个空列表(否则,每当我尝试查询 DbSet 之一时,我都会收到有关空引用的错误。然后,在单元测试中,我希望某个 DbSet 中存在非空数据,我想在该 DbSet 上再次调用 Setup 以提供该值比我想要的返回。代码如下。

我在单元测试中做到了这一点,它似乎有效,但我找不到任何有关 Moq 如何处理在同一属性上调用 Setup 两次的信息。这样做可以吗,还是会产生意想不到的副作用?使用调试器,我查看了 context.Setups,并在同一属性上第二次调用 SetupSetups 添加了第二个对象,而不是覆盖第一个,这让我担心。

[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/

相关文章:

c# - 与带分隔符的 String.Split 相反 (.net)

c# - 使用 Entity Framework 6 和 Devart 提供程序在 Mysql 上执行事务回滚时连接关闭

c# - 当行可能不存在时如何原子递增?

c# - SelectMany() 无法推断类型参数——为什么不呢?

c# - Entity Framework : Could Not Load Context

c# - 电子邮件剖析

c# - OwinStartup 类中的 Configuration 方法如何以及何时被调用/执行?

c# - ResourceManager 没有选择正确的 resx 文件

asp.net-mvc - Entity Framework 更新无跟踪实体

c# - 我可以使以下 IQueryable linq 语句通用吗