gpt4 book ai didi

transactions - EF4 Code First、TDD、CRUD 和事务

转载 作者:行者123 更新时间:2023-12-04 05:20:59 28 4
gpt4 key购买 nike

过去,我在创建看起来像这样的数据访问/存储库代码时为简单的 CRUD 操作编写了单元测试:

using(var connection = new WhateverConnection(connectionString))
{
connection.Open();
using(var transaction = connection.BeginTransaction())
{
try
{
//test the CRUD operation
}
finally
{
//gets rid of any stuff created during the test
transaction.Rollback();
}
}
}

我今天正在研究 EF4 Code First,我意识到我不知道这个测试场景在 Entity Framework 词典中是如何翻译的。看起来,如果我调用 DbContext.SaveChanges(),它会保存 提交,无论是否调用了 AcceptAllChanges()。即使使用 ObjectContext 而不是 DbContext,我也无法弄清楚如何在不手动清理创建的任何模拟/测试对象的情况下重新创建这个简单的测试场景。我读过this article on MSDN ,但是 TransactionScope 实际上也没有 Rollback 类型的方法。我是否使用 TransactionScope 而从不调用 Complete?是否有其他方法或方式使用 DbContext 和/或 ObjectContext 以便在单元测试期间回滚?我是否需要完全重新调整我对使用 EF4 Code First 的 TDD 的想法?

最佳答案

ObjectContext 本身不暴露事务行为。您必须自己将 EF 代码包装在事务中。最简单的方法是使用 TransactionScope。如果您不在作用域上调用 Complete 方法并处理它,它将执行回滚。我们通常使用基类进行此类集成测试:

[TestClass]
public abstract class TransactionTestBase
{
private TransactionScope scope = null;

[TestInitialize]
public virtual void TestInitialize()
{
scope = new TransactionScope(TransactionScopeOption.RequiresNew,
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadUncommitted
});
}

[TestCleanup]
public virtual void TestCleanup()
{
if (scope != null)
{
scope.Dispose();
scope = null;
}
}
}

所有测试类都派生自此类。 TestInitialize 在派生类中的每个 TestMethod 之前调用,而 TestCleanup 在每个 TestMethod 之后调用,因此您的测试不会必须处理事务。

关于transactions - EF4 Code First、TDD、CRUD 和事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382139/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com