繁体   English   中英

用 Moq 替换 Setup 的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM