单元测试库。为什么DBContext返回错误的值?

时间:2014-11-15 13:30:17

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

我是单元测试ASP MVC应用程序。现在我正在测试一个存储库。我在数据库中有一个表,其中包含一个属性ID(主键int),ItemName(varchar),IsValid(bit - true / false)。 在存储库中,有一些方法,如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正在缓存查询和数据,以提高测试速度。是否有任何posibitilies将禁用此chaching。或者还有其他问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

这样,每个测试都将使用新鲜的对象,并且没有先前测试中的延迟数据。