我在我的[Rollback]数据库级测试中使用了一个很好的小NUnit属性:
public class RollbackAttribute : Attribute, ITestAction
{
private TransactionScope _transaction;
public ActionTargets Targets {
get { return ActionTargets.Test; }
}
public void BeforeTest(TestDetails testDetails) {
_transaction = new TransactionScope();
}
public void AfterTest(TestDetails testDetails) {
_transaction.Dispose();
}
}这样,我就可以像这样装饰我基于数据库的测试:
[Test]
[Rollback]
public void TestGetAllActiveItems()
{
// Arrange
SetupTestData();
// Act
var results = GetAllActiveItems(string.Empty, string.Empty);
// Assert
Assert.IsNotNull(results);
}我在SetupTestData()方法中创建和存储的示例数据用于测试,然后在测试结束时丢弃。
在我的本地开发机器上,这就像SQL Server 2012和2014的魅力一样--但由于某种原因,它似乎在我们的构建和测试机器上失败了,因为它仍然在使用SQL Server 2005 (即将升级)。
知道为什么吗?我只看到我插入到我的SetupTestData()方法中的数据库中的两个项目是为每个测试方法插入一次,而NOT在每个方法的末尾回滚,因为一些奇怪的原因……我在build / testrun日志中没有看到任何错误或其他指示符--它只是不工作,并且在我的构建/测试服务器上不执行回滚操作。
有什么指示吗?有什么想法?要查点吗?
发布于 2015-04-13 20:42:12
基于这篇文章 (描述了SQL2005的具体细节),我假设您的问题可能是您正在对所有事务重用相同的连接,引用如下:
在Server 2005中,使用TransactionScope启动本地事务,而不是分布式事务。这就是TransactionScope是否与客户端代码或SQLCLR过程一起使用的行为,除非在调用SQLCLR过程时已经启动了事务。 ..。 事务实际上是在SqlConnection上调用Open时开始的,而不是在创建TransactionScope实例时开始的。 ..。 此时,由于Server 2005不支持同一连接上的自主事务,因此SqlConnection的BeginTransaction方法是本地事务的最佳选择。
请让我知道这条信息是否有效,因为我目前无法测试问题自己。
https://stackoverflow.com/questions/29610399
复制相似问题