Entity framework core 让EF Core将SQL语句输出到xUnit';ITestOutputHelper

Entity framework core 让EF Core将SQL语句输出到xUnit';ITestOutputHelper,entity-framework-core,xunit,xunit.net,ef-core-2.2,Entity Framework Core,Xunit,Xunit.net,Ef Core 2.2,我正在使用EF Core 2.2.4,并试图找出EF Core在单元测试中发送给SQLite数据库的SQL语句。因为我们使用的是xUnit(2.4.1),所以我们必须将日志消息写入xUnit注入测试类的实例,而不是控制台。对于控制台,我发现以下代码: 私有静态iLogger工厂GetLoggerFactory() { IServiceCollection serviceCollection=新serviceCollection(); serviceCollection.AddLogging(生成

我正在使用EF Core 2.2.4,并试图找出EF Core在单元测试中发送给SQLite数据库的SQL语句。因为我们使用的是xUnit(2.4.1),所以我们必须将日志消息写入xUnit注入测试类的实例,而不是控制台。对于控制台,我发现以下代码:

私有静态iLogger工厂GetLoggerFactory()
{
IServiceCollection serviceCollection=新serviceCollection();
serviceCollection.AddLogging(生成器=>
builder.AddConsole()
.AddFilter(DbLoggerCategory.Database.Command.Name,
日志级别(信息);
返回serviceCollection.BuildServiceProvider()
.GetService();
}

要将此输出重定向到
ITestOutputHelper.WriteLine()

首先,创建一些样板记录代码以允许输出到ITestOutputHelper:

类TestLoggerProvider:ILoggerProvider
{
ITestOutputHelper\u输出;
公共TestLoggerProvider(ITestOutputHelper输出)
=>\u输出=输出;
公共ILogger CreateLogger(字符串类别名称)
=>新的测试记录器(categoryName,_输出);
公共空间处置()
{
}
}
类测试记录器:ILogger
{
字符串_categoryName;
ITestOutputHelper\u输出;
公共测试记录器(字符串categoryName、ITestOutputHelper输出)
{
_categoryName=categoryName;
_输出=输出;
}
公共布尔值已启用(日志级别日志级别)
//注意:只记录与命令相关的内容,但您可以轻松扩展
//这个
=>\u categoryName==DbLoggerCategory.Database.Command.Name;
公开作废日志(
日志级别日志级别,
EventId EventId,
州,
例外例外,
函数格式化程序)
{
//TODO:如果需要,可以进一步自定义格式
//if(eventId==RelationalEventId.CommandExecuting)
//{
//var结构=(IReadOnlyList)状态;
//var parameters=(字符串)结构。首先(i=>i.Key==“parameters”)
//.价值;
//var commandText=(string)结构。首先(i=>i.Key==“commandText”)
//.价值;
//}
_WriteLine(格式化程序(状态,异常));
}
公共IDisposable BeginScope(州)
=>空;
}
接下来,确保DbContext可以接受外部选项

类MyDbContext:DbContext
{
公共MyDbContext(DbContextOptions)
:基本(选项)
{
}
}
最后,把它全部连接起来。下面是一个为每个测试创建新上下文的示例。使用或来延长上下文的生存期

public类UnitTest1:IDisposable
{
IServiceProvider\u服务提供商;
MyDbContext_db;
公共单元测试1(ITestOutputHelper输出)
{
_serviceProvider=新的ServiceCollection()
.AddLogging(x=>x.AddProvider(新的TestLoggerProvider(输出)))
.AddentityFrameworkQlite()的
.BuildServiceProvider();
_db=新的MyDbContext(
新的DbContextOptionsBuilder()
//不要打电话给UseLoggerFactory!(新的服务提供商将
//每次创建时都没有处理)
.UseInternalServiceProvider(\u serviceProvider)
.UseSqlite(“数据源=:内存:”)
(a)选择权);
}
[事实]
公共void Test1()
{
_ExecuteSqlRaw(“--你能看见我吗?”);
}
公共空间处置()
{
_db.Dispose();
(_serviceProvider作为IDisposable)?.Dispose();
}
}

我维护了一个NuGet包,您可以将其用于样板文件部分: