[TestInitialize()]
public void MyTestInitialize()
{
testTransScope = new TransactionScope(TransactionScopeOption.RequiresNew);
}
[TestCleanup()]
public void MyTestCleanup()
{
Transaction.Current.Rollback();
testTransScope.Dispose();
}
根据初始化函数中TransactionScope
对象的构建,我认为我应该得到一个新的事务范围(因为不存在“环境”范围,所以我相信这里的“.RequiresNew”并不重要,因为“.Required”会产生相同的结果)。由于我没有指定超时值,它为我提供默认超时时间,我理解默认超时时间为60秒,足够我的测试运行。
我有一个名为AddDessert(DessertBiz dessertBizObject)
的函数,其中一部分看起来像这样:
using (var transScope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
// ...
context.Desserts.Add(dessert);
context.SaveChanges();
var dessertId = dessert.Id;
DoOtherDessertStuff(dessertId, dessertBizObject);
transScope.Complete();
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
}
这个函数是由我的一个测试调用的。
既然我在这里指定了TransactionScopeOption.Required
,那么我期望它将使用MyTestInitialize
函数创建的“上下文”事务范围。
我的测试被安排成使得这个DoOtherDessertStuff
函数失败并抛出异常,因此对transScope.Complete();
的调用不会发生,而回滚会在退出AddDessert
函数中的using
块时自动发生。
我在这里遇到的问题是,因为它使用了在MyTestInitialize
函数中创建的“上下文”事务范围,所以我的测试Assert
调用没有发生,因为事务范围回滚了 - 至少我认为是这样。我验证了Transaction.Current.TransactionInformation.Status
是TransactionStatus.Aborted,所以我相当确定这就是正在发生的事情。
很好,所以我想修改我的AddDesert
方法,使其看起来与上面完全相同,只是我将嵌套一个事务范围而不是使用上下文中的一个,所以我的using
行看起来像这样:
using (var transScope = new TransactionScope(TransactionScopeOption.RequiresNew))
本意是我可以嵌套这些事务范围,让生产代码中的回滚发生,然后仍然可以检查测试代码中的断言。
但我发现我得到了以下错误:
System.IO.IOException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
有什么建议吗?