单元测试存储库.为什么DBContext返回错误的值

本文关键字:错误 返回 DBContext 存储 为什么 单元测试 | 更新日期: 2023-09-27 18:30:27

我正在对ASP MVC应用程序进行单元测试。现在我正在测试一个存储库。我在数据库中有带有属性 ID( 主键 int )、项目名称 ( varchar )、IsValid ( 位 - 真/假)的表。在存储库中,有创建,更新,删除等方法,我正在使用单元测试(测试使用atribute isValid)。还有方法getAllItems

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

运行创建、更新、删除的单元测试后,还有一个单元测试方法,用于测试 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正在缓存查询和数据以提高测试速度。是否有任何可能性可以禁用这种追逐。还是还有其他问题?

单元测试存储库.为什么DBContext返回错误的值

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

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

[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);
}

这样,每个测试都将使用新鲜对象,并且不会从以前的测试中获取滞留数据。