使用Effort和SQL CE并行进行单元测试失败

时间:2014-04-12 17:03:08

标签: c# entity-framework unit-testing sql-server-ce

我正在使用EF6和

评估单元测试

http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort是一个非常好的参考,但现在我被卡住了。

我有2个测试项目(一个用于Effort,另一个用于SQL CE)。如果我单独运行两个人就可以了。使用ReSharper测试运行器连续运行最后一个测试项目总是失败。任

  

System.InvalidOperationException:实体框架已经存在   在尝试添加之前使用DbConfiguration实例   '加载'事件处理程序'加载'事件处理程序只能添加为   应用程序的一部分在使用实体框架之前启动。

  

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; }
}

努力的测试夹具:

[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"));
    }
}

非常感谢你!

马塞尔

2 个答案:

答案 0 :(得分:11)

在我们的构建服务器上运行所有UnitTests或在本地运行所有UnitTests时,我们看到了相同的错误。

  

System.InvalidOperationException:实体框架已经存在   在尝试添加之前使用DbConfiguration实例   '加载'事件处理程序。 '加载'事件处理程序只能添加为   应用程序的一部分在使用实体框架之前启动。

一旦我们将Effort Provider注册码从[TestInitialize]方法移动到AssemblyInitialize方法,一切都开始工作了。根据报告的错误中的消息,似乎注册不会发生多次。

    [AssemblyInitialize()]
    public static void AssemblyInit(TestContext context)
    {
        Effort.Provider.EffortProviderConfiguration.RegisterProvider();
    }

答案 1 :(得分:1)

我刚才遇到过这个问题,并认为我会分享我的问题的原因。

在实施和ActionFilter之前,一切都在花哨。 事实证明,在我的测试中,Effort代码在我的网站实例化之后运行。实例化网站实例化了我的过滤器,我的过滤器从容器中请求了一个DataContext。

因此,在尝试使用Effort配置之前,有人已经使用了datacontext。

希望这对未来的某些人有所帮助,尽管这有点不同,我希望你最终解决了你的问题!