【发布时间】:2014-01-15 10:58:35
【问题描述】:
我有一对具有父/子关系的表 - 事件和事件详细信息。我有一个包含来自这两个表的信息的视图模型。我有一个业务层方法,它传递了一个需要更新两个表的视图模型实例。
所以,在方法中,我使用的是EF6的新事务机制:
using (var transaction = this.db.Database.BeginTransaction())
{
try
{
// various database stuff
this.db.SaveChanges();
// more database stuff
this.db.SaveChanges();
// yet more database stuff
this.db.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
this.logger.logException(ex, "Exception caught in transaction, rolling back");
throw;
}
}
所以,我的问题。我该如何测试?
我正在使用 Microsoft 的单元测试框架和 Moq,我在模拟 DBContexts 和 DbSets 时没有遇到任何问题,但我似乎无法弄清楚如何绕过事务。
如果我不尝试模拟交易,我会收到 InvalidOperationException:
"在应用程序中找不到名为xxx的连接字符串 配置文件。”
这很有意义 - 没有应用程序配置文件,也没有任何数据库。
但如果我尝试模拟 BeginTransaction(),我会收到初始化错误:NotSupportedException:
"非虚拟成员上的无效设置:m => m.Database.BeginTransaction”。
这让我陷入了困境,查看了 .NET 方法的反编译,试图识别一些可能从可用接口派生的类,或者我可以以某种方式注入模拟对象的东西。
我并不是要对 MS 的事务代码进行单元测试——我只是想确保对每个表中的相应记录进行了适当的更改。但就目前而言,它看起来是不可测试的,并且任何使用事务的方法都是不可测试的。这只是一种痛苦。
我用谷歌搜索了一遍,没有发现任何有用的东西。有没有人遇到过这个问题?有人对如何进行有想法吗?
【问题讨论】:
标签: c# entity-framework unit-testing asp.net-mvc-4 moq