我想通过单个集成测试来启用显式的SQL日志记录,而无需更改DbContext定义
我所拥有的:具有多个DbContext的10多个项目。 10多个测试项目。许多其他集成测试也使用EF
我尝试过的事情:
internal class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration(StreamWriter sw)
{
var interceptor = new DatabaseLogFormatter(s => { sw.WriteLine(s); });
AddInterceptor(interceptor );
}
}
通过运行此代码,开始在我的计算机上运行 explicit 的一项集成测试
var dbConfiguration = new MyDbConfiguration(fileStream);
DbConfiguration.SetConfiguration(dbConfiguration);
这很好。一次测试是记录所有EF SQL
但是,当我运行完整的测试套件(没有一个测试并且没有SetConfiguration)时,EF将(直到很晚)获取MyDbConfiguration并抛出异常
System.InvalidOperationException:在发现“ MyDbConfiguration”类型之前,实体框架已使用默认的DbConfiguration实例
如何防止这种情况?我无法更改任何app.configs
我希望EF仅在配置时使用MyDbConfiguration。
答案 0 :(得分:2)
如果您不希望Entity Framework
自动检测并获取自定义DbConfiguration
,则可以找到一种绕过自动检测规则的方法。
默认情况下(没有任何其他自定义配置),DbConfigurationFinder
中的Entity Framework
(source code)在与{ {1}}派生类被声明。
由于您不能更改任何DbConfiguration
文件,因此,一种方法是通过在单独的程序集中声明DbContext
派生类,而不是持有.config
的类。
由于将其用于集成测试目的,因此可以将其放入该测试项目中。