使用 Effort 和 SQL CE 并行进行单元测试失败
Posted
技术标签:
【中文标题】使用 Effort 和 SQL CE 并行进行单元测试失败【英文标题】:Unit testing with Effort and SQL CE in parallel fails 【发布时间】:2014-04-12 17:03:07 【问题描述】:我正在结合使用 EF6 评估单元测试
http://effort.codeplex.com/ 和 SQL CE 服务器(本地数据库文件)http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort 是一个很好的参考,但现在我被卡住了。
我有 2 个测试项目(一个用于 Effort,另一个用于 SQL CE)。如果我分别运行两者都很好。使用 ReSharper 测试运行程序连续运行两者,最后一个测试项目总是失败。要么
System.InvalidOperationException : 实体框架已经 在尝试添加之前使用 DbConfiguration 实例 “加载”事件处理程序。 'Loaded' 事件处理程序只能添加为 部分应用程序在使用实体框架之前启动。
或
System.InvalidOperationException:默认的 DbConfiguration 实例 在尝试设置 'SqlCeConfiguration' 的实例。'SqlCeConfiguration' 实例必须 在使用任何实体框架功能之前在应用程序启动时设置 或者必须在应用程序的配置文件中注册。
总是一样的。后继者从前任继承 DbConfiguration 实例。 如何在没有副作用的情况下同时运行两个测试项目/配置?
这是我的 DbContext 类:
public class DataContext : DbContext
public DataContext(string connectionString) : base(connectionString)
Configuration.LazyLoadingEnabled = false;
public DataContext(DbConnection connection) : base(connection, true)
Configuration.LazyLoadingEnabled = false;
这就是 Effort 的测试夹具:
[TestFixtureSetUp]
public void TestFixtureSetup()
EffortProviderConfiguration.RegisterProvider();
var connection = DbConnectionFactory.CreateTransient();
var dbContext = new DataContext(connection);
...
这就是 SQL CE 的测试夹具:
[TestFixtureSetUp]
public void TestFixtureSetup()
const string filePath = @"LocalDb.sdf";
var connectionString = string.Format("Data Source=0; Persist Security Info=False;", filePath);
DbConfiguration.SetConfiguration(new SqlCeConfiguration());
var dbContext = new DataContext(connectionString);
dbContext.Database.Create();
...
还有我的SqlCeConfiguration:
public class SqlCeConfiguration : DbConfiguration
public SqlCeConfiguration()
SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
SetDefaultConnectionFactory(new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0"));
非常感谢!
马塞尔
【问题讨论】:
DbConfiguration.SetConfiguration()
方法通常只允许每个 AppDomain 有一个 DbConfiguration
。您是否尝试过手动将提供程序放入连接字符串,而不是尝试在代码中进行设置?
@martin_costello 感谢您的提示。不幸的是,提供者是“不支持的关键字”。您介意为 SQL CE Server 提供一个示例连接字符串吗?
See also
【参考方案1】:
在构建服务器上运行所有 UnitTest 或在本地运行所有 UnitTest 时,我们看到了相同的错误。
System.InvalidOperationException : 实体框架已经 在尝试添加之前使用 DbConfiguration 实例 “加载”事件处理程序。 'Loaded' 事件处理程序只能添加为 部分应用程序在使用实体框架之前启动。
一旦我们将 Effort Provider 注册代码从 [TestInitialize] 方法移至 AssemblyInitialize 方法,一切就开始工作了。根据报告错误中的消息,注册似乎不能多次发生。
[AssemblyInitialize()]
public static void AssemblyInit(TestContext context)
Effort.Provider.EffortProviderConfiguration.RegisterProvider();
【讨论】:
【参考方案2】:我刚刚遇到了这个问题,我想我会分享我的问题的原因。
在我实施 ActionFilter 之前,一切都正常工作。 事实证明,在我的测试中,Effort 代码是在我的网站实例化之后运行的。实例化网站实例化了我的过滤器,我的过滤器从容器中请求了一个 DataContext。
因此,在我尝试使用 Effort 对其进行配置之前,已经有人使用了 datacontext。
希望这可能对将来的某个人有所帮助,尽管它是一个有点不同的原因,我希望你最终解决了你的问题!
【讨论】:
以上是关于使用 Effort 和 SQL CE 并行进行单元测试失败的主要内容,如果未能解决你的问题,请参考以下文章