如何将 TestServer 输出记录到测试控制台

2023-11-27

我目前正在编写集成测试(https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-5.0)对于我的 ASP .Net Core 5 REST API。 该 API 使用 Serilog 进行日志记录(使用静态 Serilog Logger)。我正在使用 NUnit、Visual Studio 2019、Resharper 运行测试。

我希望 API 代码运行时记录的所有消息都在测试控制台输出中可见。
例如,如果调用此控制器方法:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Serilog;

namespace My.Crazy.Api.Controllers
{    
    public sealed class WheelsController : Controller
    {
        [HttpGet("getwheels")]        
        public async Task<IActionResult> Get()
        {            
            Log.Error("An extremely urgent error");         
            return Ok();
        }
    }
}

我希望测试控制台中显示“极其紧急的错误”消息。
然而,这并没有发生。

这是我的测试服务器设置:

[OneTimeSetUp]
public async Task Setup()
{            
    var hostBuilder = new HostBuilder()
        .ConfigureWebHost(webHost =>
        {
            webHost.UseTestServer();
            webHost.UseStartup<Startup>();  // Startup is the API project's Startup class
    
            Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();
        });

    var host = await hostBuilder.StartAsync();
    
    _client = host.GetTestClient();
}  

[Test]
public async Task FirstTest() 
{
    var response = await _client.GetAsync("getwheels");
}

我还尝试过使用自定义接收器进行日志记录:

...
// in the test setup
Log.Logger = new LoggerConfiguration().WriteTo.Sink(new CustomSink()).CreateLogger();
...

public class CustomSink : ILogEventSink
{
    public void Emit(LogEvent logEvent)
    {
        var message = logEvent.RenderMessage();
        Console.WriteLine(message);
    }
}

这也不太有效。不过,我已经确认,当 API 代码记录任何消息时,都会调用 Emit 方法。

最后,我尝试使用文件输出:

Log.Logger = new LoggerConfiguration().WriteTo.File("C:\\temp\\test_output.txt").CreateLogger();

其效果符合预期。但是,我仍然想登录控制台。

这可能吗?

不幸的是,对 Serilog 或 NUnit 使用其他任何东西都不是一个选择。


我有同样的问题。经过几天的挖掘,我找到了初始化测试服务器的解决方法。关键是设置为true the PreserveExecutionContext默认情况下false。将其设置为true将日志带到测试输出。False- 没有服务器日志可见,只有客户端日志可见。

    var path = Assembly.GetAssembly(typeof(MyTestServer))?.Location;

    var directoryName = Path.GetDirectoryName(path);

    if (directoryName == null)
        throw new InvalidOperationException("Cannot obtain startup directory name");

    var hostBuilder = new WebHostBuilder()
        .UseContentRoot(directoryName)
        .ConfigureAppConfiguration(
            configurationBuilder => configurationBuilder.AddJsonFile("appsettings.json", false))
        .UseStartup<Startup>()
        .ConfigureTestServices(services =>
        {
            //adding mock services here
        });

    server = new TestServer(hostBuilder) 
    {
        //set this to true!!!
        PreserveExecutionContext = true 
    };

注意:我们在 .NET7 上运行这些测试(以及被测系统)。我不确定这是否有什么区别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 TestServer 输出记录到测试控制台 的相关文章

随机推荐

  • SwipeRefreshLayout 阻止水平滚动 RecyclerView

    我的设置很简单
  • 将标签移动到饼图中间

    我的饼图可以正常工作 但我注意到实际图表的文本框似乎无法正常工作 它们只是聚集在一起 所以我想知道是否有什么方法可以将标签移到白色圆圈所在的中间 并在其旁边有匹配的颜色 crimeTypes dict crimeData Crime typ
  • 抽象类的集合(或类似的东西......)

    场景 我正在用 Java 编写一个涉及汽车的程序 注意 我 尽我所能 简化了这个场景 使其更通用且更容易理解 我实际上并不是在和汽车打交道 我创建了一个Cars类 它是一个集合Car对象 The Car对象有一个speed 双 和一个yea
  • Google Place API - 始终返回此“状态”:“REQUEST_DENIED”

    我目前正在使用 Google Place API 每当我要访问此链接时都会遇到问题 输入如下信息纬度 经度 and API key并设置传感器等于假 但它总是显示 debug info html attributions results s
  • python 套接字挂在连接上

    我正在尝试使用套接字模块在 python 中创建透明代理 但由于某种原因 它挂在 connect 套接字上 这是我正在使用的代码 from future import division import socket import struct
  • 如何生成 Swagger codegen Java 模型作为 JPA 实体

    我正在使用 Swagger codegen 创建要在 Spring REST 服务器中使用的 Java 模型 并且想知道如何让 Swagger 将每个模型声明为 JPA 实体 我用以下代码生成代码swagger codegen maven
  • 如何修改此 t-sql 查询以返回不同列名的最大值?

    我有以下查询 SELECT Rate RateMon RateTue RateWed RateThu RateFri RateSat RateSun FROM Room WHERE Id Id 我只想返回 而不是返回所有列Rate以及 Ra
  • C++ 中的电子邮件验证

    好的 我正在尝试制作一个允许用户输入电子邮件的程序 如果满足两个条件 他们的电子邮件将被视为有效 A 其中必须有一个 符号 B 后面必须有一个句点 我把大部分代码都写下来了 但是在验证 符号之前有句点的电子邮件时 我遇到了一些困难 如果它们
  • 通过 App Delegate 的 UITabBarController 检测何时按下 tabBar 项目

    我知道这个问题已经被问过几次了 但当我有我的资料时 我仍然坚持这个问题UITabBarController in my AppDelegateclass 和 viewControllers 仅设置为 self tabBarControlle
  • 无法在 Windows 上安装 python Polyglot 包

    我正在尝试使用以下命令安装 Polyglot 包 pip install polyglot 我收到以下信息 Collecting polyglot Using cached polyglot 15 10 03 py2 py3 none an
  • 你能举一个C++中堆栈溢出的例子吗?

    你能举一个C 中堆栈溢出的例子吗 不涉及无限递归的典型情况是在堆栈上声明太大的自动变量 例如 int foo int array 1000000
  • 在 PHP 类中使用外部变量

    我对 PHP 课程非常陌生 所以如果答案真的很明显 请原谅我 我试图弄清楚如何在类内部使用类外部定义的变量 这是一个非常粗略的例子 myVar value class myClass private class var myVar REST
  • MySQL 错误 1045,“用户 'user'@'localhost' 的访问被拒绝(使用密码:YES)”

    这个问题似乎被问了很多 但我找不到明确的答案 我正在使用 MySQL 进行一些 webapp 测试 一开始我使用 root 用户 具有非空密码 我的 root 用户在应用程序 通过 PHP 和 Python 的 Django 测试 命令行以
  • 获取/使用 Firebase JWT

    很早就接触了 Firebase 文档 到目前为止非常喜欢它 作为 n00b 这里有一个概念性问题 Firebase 身份验证生成的 JWT 令牌是否可以在客户端访问 我想打电话给一些人external服务并希望利用 JWT 作为安全机制 所
  • 如何生成有效的 ECDSA EC 密钥对?

    我正在尝试在 Android 中使用 SpongyCastle 生成 ECDSA 密钥对 这是代码 static Security insertProviderAt new org spongycastle jce provider Bou
  • catalina.bat 开始不工作

    由于某些奇怪的原因 我在启动 tomcat 时遇到问题 它曾经 之前启动没有问题 错误太长 无法复制 完全从命令提示符 有人知道可能出了什么问题吗 C apache tomcat 7 0 8 bin gt catalina bat star
  • 如何在 macOS 的 SwiftUI 中使用菜单命令实现多窗口?

    情况 实现一个多窗口应用程序 其中每个窗口都有自己的状态 Example 这是一个例子 在 github 上 来展示问题 import SwiftUI main struct multi window menuApp App var bod
  • Casperjs 使用 casper.each 迭代链接列表

    我正在尝试使用 Casperjs 从页面获取链接列表 然后打开每个链接 并将这些页面中特定类型的数据添加到数组对象 我遇到的问题是在每个列表项上执行的循环 首先我得到一个listOfLinks从原始页面 这部分有效 并且使用长度我可以检查该
  • twitter bootstrap 轮播直接链接到特定幻灯片

    我在我的网站上使用 twitter bootstrap carousel 来显示一组图像 我想知道是否可以允许链接链接到轮播中的特定幻灯片 因此 在 10 张幻灯片中 用户可以单击链接直接从 href 链接转到幻灯片 5 这可以通过引导轮播
  • 如何将 TestServer 输出记录到测试控制台

    我目前正在编写集成测试 https learn microsoft com en us aspnet core test integration tests view aspnetcore 5 0 对于我的 ASP Net Core 5 R