Mar*_*cel 10 c# unit-testing entity-framework 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:在尝试设置"SqlCeConfiguration"实例之前,实体框架使用了默认的DbConfiguration实例.在使用任何Entity Framework功能之前,必须在应用程序启动时设置"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"));
    }
}
非常感谢!
马塞尔
小智 12
在构建服务器上运行所有UnitTests或在本地运行所有UnitTests时,我们看到了相同的错误.
System.InvalidOperationException:在尝试添加"已加载"事件处理程序之前,实体框架已在使用DbConfiguration实例."加载"事件处理程序只能在使用实体框架之前作为应用程序启动的一部分添加.
一旦我们将Effort Provider注册码从[TestInitialize]方法移动到AssemblyInitialize方法,一切都开始工作.根据报告的错误中的消息,似乎注册不会发生多次.
    [AssemblyInitialize()]
    public static void AssemblyInit(TestContext context)
    {
        Effort.Provider.EffortProviderConfiguration.RegisterProvider();
    }
| 归档时间: | 
 | 
| 查看次数: | 2624 次 | 
| 最近记录: |