【问题标题】:Is it possible to prevent EF SaveChanges() from writing to DB?是否可以防止 EF SaveChanges() 写入数据库?
【发布时间】:2010-07-20 20:14:40
【问题描述】:

我有基于 Entity Framework 4 的服务类。我想在一个填充了预先生成的示例数据的数据库上测试它们。问题是:我希望测试,无论是通过还是失败,都不要真正接触数据库,以便它可以重新用于其他测试。

因此,我希望 ObjectContext.SaveChanges 假装一切正常,并将更改保存在内存中,但默默地忽略它们在数据源中的实际持久性。这可能吗?

附:我知道存储库模式,但不想在这种情况下使用它。

【问题讨论】:

  • 如果您不在数据级别测试它的影响,为什么还要调用 SaveChanges?
  • 是的,我也有同样的想法 :-) 可能是传递给服务构造函数的标志。可惜像 DRI 这样的东西不会被测试,但我认为没有办法在不访问数据库的情况下测试它们。

标签: .net unit-testing entity-framework


【解决方案1】:

您只需将测试包装在您不提交的事务中:

using(var context = new MyObjectContext())
{
    context.Connection.Open();
    using (var transaction = context.Connection.BeginTransaction())
    {
        // Your tests here
        ...

    } // At this point, the transaction is rolled back, since it hasn't been commited
}

【讨论】:

    【解决方案2】:

    我要在这里用这个四肢走出去......我知道它可以与 linq-to-sql 一起使用

    您可以在上下文/容器中覆盖 savechanges 方法

    并实际删除 base.SaveChanges();

    看起来像这样:

    public override int SaveChanges(SaveOptions options){
       return base.SaveChanges();
    }
    

    所以如果你取消注释这行,你可以根据你的情况调整它

    【讨论】:

    • 谢谢,试试这个。 (或者也许只是按照上面提到的路线......)
    • 为单元测试添加注释或取消注释对我来说似乎是个糟糕的主意...如果您在投入生产之前忘记取消注释对base.SaveChanges 的调用怎么办?您应该绝不仅仅为了测试目的而修改您正在测试的代码。一个更好的主意是为测试创建一个特定的 ObjectContext,您可以在其中覆盖 SaveChanges。但即使这样也不是一个好的解决方案,因为对 ObjectContext 所做的更改在您调用 SaveChanges 之前在查询中是不可见的
    猜你喜欢
    • 2020-11-01
    • 2011-10-25
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多