使用 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 并行进行单元测试失败的主要内容,如果未能解决你的问题,请参考以下文章

sql server 有很多相关版本 请问具体区别是啥呢?

用于多个应用程序中的 C# 类库的 SQL Server CE 私有部署

如何使用 Sql CE 4 数据库进行功能测试

如何查询oracle 数据库并行度

如何使用 SQL CE 4.0 创建内存数据库?

使用Effort的XML列