its*_*att 7 c# mysql mstest entity-framework transactions
我正在使用MSTest通过MySQL Connector和使用EntityFramework 4.3对MySQL 5.5.19数据库运行一些自动化测试.
我正在尝试TransactionScope在我的数据库访问类库中使用,以在需要时执行回滚.另外,在我的测试代码中,我希望TransactionScope在每次测试之前将数据库重新置于已知状态.我使用TestInitialize和TestCleanup方法来完成这个.那些看起来像这样:
[TestInitialize()]
public void MyTestInitialize()
{
testTransScope = new TransactionScope(TransactionScopeOption.RequiresNew);
}
[TestCleanup()]
public void MyTestCleanup()
{
Transaction.Current.Rollback();
testTransScope.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
基于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());
}
}
Run Code Online (Sandbox Code Playgroud)
并且我的一个测试调用了这个函数.
由于我在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))
Run Code Online (Sandbox Code Playgroud)
这里的意图是我可以嵌套这些事务范围,让我的生产代码中的回滚发生,然后仍然Assert在我的测试代码中检查我的s.
但我发现我得到以下错误:
System.IO.IOException:无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机无法响应而建立的连接失败.
想法?
非常好的问题。当您在回滚后在测试方法中引用数据上下文时,它将不可用。你需要抑制它。您不需要指定所需的选项。这是默认选项。
测试方法:
[TestMethod()]
public void CreateTestCheckContextCorrectly()
{
MailJobController target = new MailJobController();
target.AddDessert("dessert for Omer");
//With suppress, even if you rollback ambient trans, suppress will ignore ambient trans. You need to reference new context, previous context from controller may be disposed.
using (var suppressscope = new TransactionScope(TransactionScopeOption.Suppress))
{
var newdbcontextref = new DbEntities();
int recordcount = newdbcontextref.StatusDefinitions.Where(x => x.Name == "dessert for Omer").Count();
Assert.AreEqual(0, recordcount);
}
}
Run Code Online (Sandbox Code Playgroud)
控制器方法:
public void AddDessert(string dessert)
{
using (var transScope = new TransactionScope())
{
try
{
// ...
StatusDefinition statusDefinition = new StatusDefinition() {Name = dessert};
db.StatusDefinitions.AddObject(statusDefinition);
db.SaveChanges();
Console.WriteLine("object id:"+statusDefinition.StatusDefinitionId);
throw new Exception("hee hee");
transScope.Complete();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |