C# 单元测试似乎使用数据库中的旧数据

C# 单元测试似乎使用数据库中的旧数据,c#,asp.net-mvc,linq,unit-testing,moq,C#,Asp.net Mvc,Linq,Unit Testing,Moq,目前我正在尝试为我的项目创建一个单元测试 但是这个单元测试失败了。。。 create部分运行正常,但在单元测试的最后一行失败。 问题是,如果我在最后一行添加一个断点并将鼠标悬停在“actual”(bottem的第二行)上,它会说该客户的名字是“customerBeforeEdit”,但如果我在该断点处于活动状态时签入数据库,它实际上将是“customerAfterEdit”。因此,出于某种原因,测试方法将使用数据库的旧值。有人知道这是为什么吗?我如何解决 谢谢,Vince旁注:单元测试不应该使用

目前我正在尝试为我的项目创建一个单元测试

但是这个单元测试失败了。。。 create部分运行正常,但在单元测试的最后一行失败。 问题是,如果我在最后一行添加一个断点并将鼠标悬停在“actual”(bottem的第二行)上,它会说该客户的名字是“customerBeforeEdit”,但如果我在该断点处于活动状态时签入数据库,它实际上将是“customerAfterEdit”。因此,出于某种原因,测试方法将使用数据库的旧值。有人知道这是为什么吗?我如何解决


谢谢,Vince

旁注:单元测试不应该使用数据库中的数据,如果测试中的代码读取/写入数据库,则此类测试通常称为“集成”测试(作为单元测试后的下一级测试)。您似乎在单元测试中使用单独的
customerRepository
,以验证数据,并且假定正在测试的
控制器
有自己的独立存储库实例。因此,测试存储库不知道控制器对客户所做的更改,因此可能存在过时缓存。建议您在测试中每次提取之前创建一个新的存储库(或者使用不同的数据访问技术,例如简单ADO)。为了证实Alexei的观察,像这样测试整个堆栈称为集成测试。你可能是对的,我想我需要设置控制器的customerRepository。谢谢你说这实际上是一个集成测试
    [TestMethod]
    public void CustomerCreateEdit()
    {
        //Create Customer
        customer = new Customer();
        customer.Name = "customerBeforeEdit";
        controller.Create(customer);
        Assert.AreEqual(customer.Name, customerRepository.GetById(customer.Id).Name, "Customer Added");

        //Edit Customer
        customer.Name = "customerAfterEdit";
        var fakeForm = new FormCollection();
        fakeForm.Add("Name", customer.Name);
        controller.ValueProvider = fakeForm.ToValueProvider();
        controller.Edit(customer);
        Customer actual = customerRepository.GetById(customer.Id);
        Assert.AreEqual(customer.Name, actual.Name, "Customer Edited");

    }