我正在使用 MSTest 通过 MySQL 连接器并使用 EntityFramework 4.3 对 MySQL 5.5.19 数据库运行一些自动化测试。
我正在尝试TransactionScope
在我的数据库访问类库中使用以在需要时执行回滚。此外,在我的测试代码中,我希望TransactionScope
在每次测试之前将数据库恢复到已知状态。我使用TestInitialize
andTestCleanup
方法来实现这一点。那些看起来像这样:
[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();
不会发生调用,并且在退出函数中的using
块时会自动发生回滚。AddDessert
我在这里遇到的问题是,由于它使用在MyTestInitialize
函数中创建的环境事务范围,我的测试Assert
调用不会发生,因为事务范围回滚发生了 - 至少这是我认为正在发生的事情。我验证了这Transaction.Current.TransactionInformation.Status
是TransactionStatus.Aborted,所以我很确定这就是正在发生的事情。
太好了,所以我想我会改变我的AddDesert
方法,让它看起来和上面一样,除了我会嵌套一个事务范围而不是使用环境范围,我的一些using
行看起来像这样:
using (var transScope = new TransactionScope(TransactionScopeOption.RequiresNew))
这里的意图是我可以嵌套这些事务范围,让我的生产代码中的回滚发生,然后仍然Assert
在我的测试代码中检查我的 s。
但我发现我收到以下错误:
System.IO.IOException: Unable to read data from the transport connection: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。
想法?