C#实体测试-调试时,测试通过,但在运行模式下失败

C#实体测试-调试时,测试通过,但在运行模式下失败,c#,unit-testing,testing,C#,Unit Testing,Testing,我想检查我的remove方法是否有效:)我在数据库中添加了一个元组 测试方法 [TestMethod] public void DeleteIngredient() { using (var ctx = new TestDbContext()) { //Arrange Ingredient ingredient = new TestClass.Ingredient(); in

我想检查我的remove方法是否有效:)我在数据库中添加了一个元组

测试方法

 [TestMethod]
    public void DeleteIngredient()
    {
        using (var ctx = new TestDbContext())
        {
            //Arrange
            Ingredient ingredient = new TestClass.Ingredient();
            ingredient.Id = 1;
            ingredient.Name = "Watermelon";
            ingredient.VegeOrVegetarian = VeganType.Both;
            //Act
            ctx.ingredients.Add(ingredient);
            ctx.SaveChanges();
            IngredientService service = new IngredientService(ctx);
            service.removeIngredient(1);
            service.saveChanges();

            //Assert
            Assert.AreEqual(0, ctx.ingredients.Count());
        }
    }
服务

        public class IngredientService
{
    private readonly TestDbContext _TestDbContext;

    public IngredientService(TestDbContext TestDbContext)
    {
        _TestDbContext = TestDbContext;
    }

    public List<Ingredient> getIngredients()
    {
        return _TestDbContext.ingredients.ToList();
    }

    public void removeIngredient(int id)
    {
        var toRemove = _TestDbContext.ingredients.Find(id);       
        _TestDbContext.ingredients.Remove(toRemove);

    }
    public void saveChanges()
    {
        _TestDbContext.SaveChanges();
    }
}
我被告知考试通过了。 但在运行模式下运行所有测试(包括此删除)后,我得到一个错误

Assert.AreEqual失败,应为:。实际的

我认为上下文有问题。有没有解决这个问题的线索?

简短版本:

不要使用DbContext获取验证所需的数据。要获取此数据,请不要使用ORM方法:DbConnection、DbCommand等

测试算法:

  • 通过非ORM方法从db获取StartData
  • 用ORM方法做你想测试的事情
  • 释放ORM上下文或关闭会话
  • 通过非ORM方法从db获取EndData
  • 验证数据
  • 为什么要这样做,答案是复杂的。由于使用不同版本和类型的库进行测试,ORM和数据库提供商对于可能出现的问题没有简单的答案

    对不起我的英语

    简短版本:

    不要使用DbContext获取验证所需的数据。要获取此数据,请不要使用ORM方法:DbConnection、DbCommand等

    测试算法:

  • 通过非ORM方法从db获取StartData
  • 用ORM方法做你想测试的事情
  • 释放ORM上下文或关闭会话
  • 通过非ORM方法从db获取EndData
  • 验证数据
  • 为什么要这样做,答案是复杂的。由于使用不同版本和类型的库进行测试,ORM和数据库提供商对于可能出现的问题没有简单的答案


    对不起我的英语

    我不知道您的数据库是如何配置的,但是您可以尝试调用
    service.removeingreement(component.Id)而不是?您可能最终得到的其他id不是1ye我知道它只是临时添加的XD您确定您没有运行使用相同数据库的其他测试吗?您能否在开始时添加一个clear并保存更改以确保我不知道您的数据库是如何配置的,但您能否尝试调用
    service.removeingredit(component.Id)而不是?您可能最终得到的其他id不是1ye我知道它只是临时添加的XD您确定您没有运行使用相同数据库的其他测试吗?能否在开头添加一个clear并保存更改以确保
    
    Assert.AreEqual(0, ctx.ingredients.Count());