【发布时间】:2021-01-12 19:47:48
【问题描述】:
我正在 .Net Core 3.1 中创建一个新应用。
我已经创建了数据库,现在我正在处理业务逻辑,它位于服务集合中。在我开始创建 API 或 UI(即:任何网络应用程序类型的项目)之前,我希望 100% 让所有数据访问和服务首先按预期工作......包括日志记录。为了确保这一切都能正常工作,我想创建一些集成测试。
我遇到的问题是我真的很想知道如何让日志记录工作。我能找到的每个教程、文档和所有示例都假设您拥有 Program.cs 和 Startup.cs。
注意 1: 我希望日志记录能够像在生产中一样工作,这意味着一直到 SQL。没有嘲讽。没有替代品。无需更换。
注意 2:我不太关心测试中的日志记录。我希望日志能够在服务中工作。
这是我目前拥有的集成测试 (xUnit) 类的示例。它正在工作,但没有日志记录。
namespace MyApp.Test
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IAccountService, AccountService>();
services.AddTransient<IAppSettings, AppSettings>();
}
}
public class AccountServiceTests
{
private readonly IAccountService _account;
private readonly IAppSettings _settings;
public AccountServiceTests(IAccountService account, IAppSettings settings)
{
_account = account;
_settings = settings;
}
[Fact]
public async Task AccountService_CreateAccount()
{
Account account = new Account( {...} );
bool result = _account.CreateAccount(account);
Assert.True(result);
}
}
}
由于 NuGet Xunit.DependencyInjection,DI 正在工作。
然后在服务中...
public class AccountService : ServiceBase, IAccountService
{
protected readonly ILogger _logger;
protected readonly IAppSettings _settings;
public AccountService(ILogger<AccountService> logger, IAppSettings settings)
{
_logger = logger;
_settings = settings;
}
public bool CreateAccount()
{
// do stuff
_logger.Log(LogLevel.Information, "An account was created."); // I WANT THIS TO END UP IN SQL, EVEN FROM THE TEST.
}
}
测试通过,并且在数据库中正确创建了帐户。然而,据我所知,这条线没有做任何事情:
_logger.Log(LogLevel.Information, "An account was created.");
我明白为什么。 Microsoft.Extensions.Logging 只是一个抽象,我需要实现一些具体的日志记录(用 SeriLog 或 Log4Net 等)
这让我回到了最初的问题:在我的一生中,我找不到关于如何让其中任何一个(SeriLog 或 Log4Net)在集成测试(尤其是 xUnit)中工作的工作教程。
任何帮助,或指向正确的方向,或指向教程的链接都会很棒。谢谢。
【问题讨论】:
-
您好,Casey,我认为问题不在于缺少具体的记录器。相反,您可能需要在设置测试夹具时提供基本的日志记录配置。通常这可以通过在主机构建器上调用
ConfigureLogging来完成,但在这种特殊情况下我不确定。我的工作 PC 上没有可用的 .Net Core。我建议考虑在 .Net Core 控制台应用程序中设置日志记录。 -
@Amy,谢谢。我认为你是正确的。我完全没有在这方面找到任何东西,这让我觉得我找错了树。我需要一位专家来咨询。
标签: c# .net .net-core integration-testing .net-core-logging