过去,我在创建数据访问/存储库代码时为简单的 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,我意识到我不知道这个测试场景如何在实体框架词典中转换。看来,如果我打电话DbContext.SaveChanges()
,它节省了and承诺,无论是否AcceptAllChanges()
被称为。即使使用ObjectContext
代替DbContext
,我无法弄清楚如何在不手动清理创建的任何模拟/测试对象的情况下重新创建这个简单的测试场景。我确实读过MSDN 上的这篇文章 http://msdn.microsoft.com/en-us/library/bb738523.aspx, but 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
所以你的测试根本不需要处理事务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)