【问题标题】:Unit testing repository. Why is DBContext returning bad values?单元测试存储库。为什么 DBContext 返回错误值?
【发布时间】:2014-11-15 13:30:16
【问题描述】:

我正在对 ASP MVC 应用程序进行单元测试。现在我正在测试一个存储库。我在数据库中有属性 ID(主键 int)、ItemName(varchar)、IsValid(位-真/假)的表。 在存储库中,有一些方法,如 Create、Update、Delete,我正在使用单元测试进行测试(测试使用属性 isValid)。还有方法getAllItems

public IEnumerable<Item> GetAllItems()
{
return _db.ItemSet.Where(w => w.isValid);
}

在运行 Create、Update、Delete 的单元测试之后,还有一种单元测试方法可以测试 getAllWorkitem 方法。

[TestMethod]
    public void GetAllItems_Test()
    {
        //Arrange
        var allWorkitems = _ws.GetAllItems();
        //Act

        //Assert
        foreach (Item currentItem in allItems)
        {
            Assert.AreEqual(true, currentItem.Valid);
        }

    }

如果我单独运行所有测试,它可以正常工作。如果我一起运行所有测试,就会出现问题。 在 var allWorkitems 中有 isValid = false 和 isValid = true 的项目。

我认为 dbContext 正在缓存查询和数据以提高测试速度。是否有任何可能会禁用这种chaching。还是有其他问题?

【问题讨论】:

  • 您是否在所有测试之间共享_ws 对象?
  • 是的,我有一个 dbContext。

标签: c# asp.net-mvc unit-testing caching dbcontext


【解决方案1】:

在每个单元测试执行之前,您必须将测试的上下文设置为干净的状态。我的意思是您需要清除上一个测试可能创建的所有数据,为下一个测试清除路径。

一种方法是使用测试设置方法,例如

[TestInitialize]
public void Setup()
{
    // This function will be executed before each test.
    // Use this function as an opportunity to clear any shared objects e.g.
    // dbContext <- Delete all data that is not required.
}

[TestMethod]
public void Test1()
{
    // Arrange.
    // Add 1 item to the dbContext

    // Act
    var actual = _ws.GetAllItems();

    // Assert.
    Assert.AreEqual(1, actual.Count());
}

[TestMethod]
public void Test2()
{
    // Arrange.
    // Here, the dbContext will have been cleared in the Setup() function.
    // Add 5 items to the dbContext

    // Act
    var actual = _ws.GetAllItems();

    // Assert.
    Assert.AreEqual(5, actual.Count()); // Total items should be 5, not 6.
}

以上所有代码都是假设性的,我是即时编造的。但是,它确实说明了我的观点,即您需要在执行每个单元测试之前将它们配置为处于预期状态。

编辑:

根据您的评论,您的设置方法可能如下所示:

[TestInitialize]
public void Setup()
{
    _db = new MyIContainer();
    _ws = new ItemService(_db);
}

这样,每个测试都将使用新的对象,并且没有来自先前测试的挥之不去的数据。

【讨论】:

  • 听起来很完美。那么我应该在设置中做什么?我有私有静态 MyIContainer _db = new MyIContainer();和 IItemService _ws = new ItemService(_db);我应该在带有注释 [TestInitialize] 的方法中再次初始化它吗?
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2019-11-27
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多