【发布时间】:2011-11-21 19:29:46
【问题描述】:
目标很简单——回滚单元测试插入的数据。这是怎么回事。在单元测试中,会调用一个创建新连接并插入一些数据的方法。之后,单元测试会创建一个新连接并尝试查找已插入的内容并对其进行断言。我希望用TransactionScope 包装这两件事,而不是调用Complete 并查看插入的数据回滚。那没有发生。是我做错了什么还是我没抓住重点?
using (new TransactionScope())
{
// call a method that inserts data
var target = new ....
target.DoStuffAndEndupWithDataInDb();
// Now assert what has been added.
using (var conn = new SqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{
// Just read the data from DB
cmd.CommandText = "SELECT...";
conn.Open();
int count = 0;
using (var rdr = cmd.ExecuteReader())
{
// Read records here
...
count++;
}
// Expecting, say, 3 records here
Assert.AreEqual(3, count);
}
}
编辑:我认为我的机器上没有运行和配置 DTC。所以我启动了服务并尝试配置 DTC,但我收到了这个错误。
【问题讨论】:
-
你的单元测试真的不应该触及任何像数据库这样的外部依赖。
-
当然。考虑一个集成测试。顺便说一句,实际上我可能不使用 SQL 连接,而是使用内存数据库适配器。因此,尽管您的 cmets 通常是正确的,但它们对回答问题没有帮助。此外,这只是一个可以应用于不是单元测试而是程序中正常算法工作流的用例。
-
您是否跟踪发送到数据库(SQL Profiler)的指令?
-
@Erno:没有。这是一个很好的建议。我想我不会在那里看到任何回滚。这就是为什么我想知道我是否做错了什么,或者这不是为那样工作而设计的。
-
不,你没有错过重点。如果您不调用 Complete(),您绝对不应该看到提交到数据库的数据。 “DoStuff ...”方法内部实际发生了什么?此外,您是否真的需要为您的测试提供两个单独的连接对象,或者您可以在整个测试中使用单个 SqlConnection 和 SqlTransaction?
标签: c# .net sql transactionscope