我正在使用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"));
}
}
非常感谢你!
马塞尔
答案 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。
希望这对未来的某些人有所帮助,尽管这有点不同,我希望你最终解决了你的问题!