- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 .NET 6 Web API 项目,其中包含针对某些 API 端点的现有集成测试。该项目使用 Serilog 进行日志记录,到目前为止一切正常。
我将代码迁移到新的最小托管模型,在此过程中删除了 Startup 类。我修复了集成测试以使用新模型,到目前为止一切都在运行。我遇到的唯一问题是,集成测试现在会发送垃圾日志语句。
对于 Serilog,我有两个阶段设置,这就是 Program.cs 的样子:
public partial class Program
{
public static string ApplicationVersion => typeof(Program).Assembly
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
.InformationalVersion;
/// <summary>
/// Hack to prevent duplicate logger initialization when integration tests run in parallel.
/// </summary>
public static bool IsIntegrationTestRun = false;
public static int Main(string[] args)
{
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
if (!IsIntegrationTestRun)
{
// extra logger only for app startup
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateBootstrapLogger();
}
try
{
Log.Information("Starting <my application> v{version} in env {env}.", ApplicationVersion, env);
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("appsettings.Local.json", true, true);
// Actual logger for dependency injection
builder.Host.UseSerilog((ctx, lc) =>
{
lc.ReadFrom.Configuration(ctx.Configuration);
});
// ...
var app = builder.Build();
// ...
using (IServiceScope scope = app.Services.CreateScope())
{
var dataContext = scope.ServiceProvider.GetRequiredService<DataContext>();
dataContext.Database.Migrate();
}
app.UseSerilogRequestLogging(c =>
{
c.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
diagnosticContext.Set("Host", httpContext.Request.Host.ToString());
diagnosticContext.Set("UserAgent", httpContext.Request.Headers["User-Agent"]);
};
c.GetLevel = LogLevelHelper.GetRequestLevel;
});
// ...
app.Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly.");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
}
这是我的 WebApplicationFactory:
[CollectionDefinition("WebApplicationFactory")]
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup>
where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
// Somewhat hacky but prevents duplicate logger initialization when integration tests run in parallel.
Program.IsIntegrationTestRun = true;
builder.ConfigureAppConfiguration((context, builder) =>
{
// Load custom appsettings for Test
builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.Test.json"));
// optional load personal settings included in gitignore
builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.LocalTest.json"), true);
builder.AddEnvironmentVariables();
});
// builder.ConfigureLogging(lb => lb.ClearProviders());
Log.Logger = new LoggerConfiguration().MinimumLevel.Fatal().CreateLogger();
// ...
}
}
这样使用:
[Collection("WebApplicationFactory")]
public class SomeTests : IClassFixture<CustomWebApplicationFactory<Program>>
{
private readonly CustomWebApplicationFactory<Program> _factory;
public SomeTests(CustomWebApplicationFactory<Program> factory)
{
_factory = factory;
}
[Fact]
public async Task Get_Some_ReturnsSomething()
{
// setup ...
HttpClient client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", RequestHelper.GetBearerAuthenticationHeaderValue(user));
RequestHelper.AddStrangeHeader(client, user.StrangeKey);
HttpResponseMessage response = await client.GetAsync("/api/some");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var res = await RequestHelper.DeserializeResponse<List<SomeModel>>(response);
Assert.Equal(SomeCount, res.Count);
}
}
如您所见,我已经扩展了 appsettings.json 模式以使用本地 gitignored 文件进行本地开发(将 secret 排除在 repostiory 之外)和一个额外的 appsettings.Test.json
(和另一个 git 忽略了 appsettings.LocalTest.json
和额外的测试设置,比如不同的数据库连接)。
当我运行集成测试控制台时,日志语句充斥着垃圾邮件。奇怪的是,似乎并没有记录所有内容,例如我看不到任何请求日志。但是我可以多次看到数据库迁移的日志,如下所示:
[09:57:38 INF Microsoft.EntityFrameworkCore.Migrations] 应用迁移“20210224073743_InitialSchema”
或者这个
[09:57:40 DBG lJty8ESu24x-MY6n4EYr Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler] 成功验证 token 。
。
我尝试了很多方法,比如将最低日志级别设置为 Fatal
或直接用新的记录器替换 Log.Logger。
应用程序本身正在使用注入(inject)的 ILogger 而不是静态的 Log.Logger。谁能指导我如何解决这个问题或下一步我可以尝试什么?
日志记录似乎符合我的 appsettings.Test.json
文件中的设置,当我降低最低调试级别时,我可以看到更多日志在测试运行时打印。但是,为什么即使我将最低级别设置为致命级别,也会记录迁移消息?
最佳答案
我想我已经做到了。在您的 CustomWebApplicationFactory
中,将其放入您的 ConfigureWebHost
:
[CollectionDefinition("WebApplicationFactory")]
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup>
where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
#pragma warning disable CS0618
builder.UseSerilog((_, _) => { });
#pragma warning restore CS0618
// ... other customizations
base.ConfigureWebHost(builder);
}
}
它会提示该方法已过时,但这对我有用,它会停止调用我原来的 Serilog 配置,并且只会停止记录任何内容。如果您愿意,我相信您也可以使用它来更改配置。
2022 年 12 月 19 日更新:我刚刚找到了一种更简洁的方法,即使没有 Serilog 也能正常工作:
[CollectionDefinition("WebApplicationFactory")]
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup>
where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(services =>
{
services.AddSingleton<ILoggerFactory, NullLoggerFactory>();
});
// ... other customizations
base.ConfigureWebHost(builder);
}
}
这为我关闭了所有日志。
关于c# - 如何使用 .NET 6 的新最小托管模型在集成测试中使 Serilog 静音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70784030/
是否有一些系统通知可供我订阅,以便在用户切换响铃/静音按钮时收到通知?我还想知道苹果是否提供了一些“系统通知列表”。我花了一个小时搜索这个但失败了。 最佳答案 没有办法找出这一点。苹果在回应一些请求时
我用 a-videosphere 制作了一个 a-scene。我尝试使用按钮启用/禁用声音,但有些想法不起作用?这是我的代码: var gargamel = 0; function
我正在寻找可以检测并让我知道1分钟的wav文件是否包含声音的实用程序/代码? 换句话说,如果它可以检测到wav文件中任何位置的静默持续时间(如果存在),则也可以达到目的。 SOX是否为此支持任何命令?
我想知道是否可以只使特定 窗口静音。例如,我打开了 Firefox 和另外两个窗口。我想将与 Firefox 相关的所有内容静音,但不想关闭计算机的全部声音。 这可能吗?如果可以,如何实现? 最佳答案
我不知道如何处理我的 JavaScript 中的静音/取消静音按钮,我已经处理这个问题好几个小时了!基本上我的静音按钮可以正常工作,它可以使视频静音,我现在正试图让同一个按钮取消视频静音。有任何想法吗
我正在尝试将 AVCaptureSession 的音频静音和取消静音。开始 session 后,我可以启用和禁用音频连接,但是一旦我播放视频,所有音频部分都会被推回视频的前面,只留下视频的结尾没有声音
我有一组 php/html 页面,其中包含当鼠标悬停在其上时会播放声音的按钮。现在我希望当用户单击另一个按钮时,它会使网站的所有页面静音或将它们置于声音中,具体取决于声音是否已打开。 我已经有一个 h
我正在使用 AudioServicesPlaySystemSoundWithCompletion 播放系统声音,并使用 AVAudioPlayer 播放自定义声音。 为什么打开静音开关会播放声音?我已
我正在使用名为 ExoPlayer 的 Google 新 MediaPlayer,但找不到静音的方法 有没有一种简单的方法可以在 Google ExoPlayer 上将音轨静音?还是改变音量? 最佳答
我收到了大量关于零时长和弦的 music21 警告: WARNING: midi chord with zero duration will be treated as grace 我尝试用以下内容覆
我正在尝试在后台启动端口转发,同时抑制所有输出。这是我尝试过的: kubectl port-forward pod-name 1234:1234 > /dev/null 2>&1 & 然而,当我发起连
我想继续录音,但音频已静音。我是 不是 希望暂停音频。 我现在的替代方法是暂停音频,加入静音填充,继续录音,但如果有更简单的方法,那就太好了。 最佳答案 我也遇到过这个问题,经过长时间的研究,我得到了
在我的 iPhone 应用程序中,我想要静音和取消静音 MPMoviePlayerController。我进行了很多搜索,但无法成功。是否可以在 MPMoviePlayer Controller 中将
我已经看到了确保应用程序遵循静音开关的技术,但是是否可以使用 SDK 将 iPhone 设置为静音(任何应用程序都不会发出声音)? 最佳答案 没有。 使用官方 SDK 开发的应用程序无法更改(并且在大
我要播放以下背景音乐: NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/bgMusic.mp3", [[NSBu
我希望仅为我的 WPF 应用程序静音,并让整个混音器保持用户设置的状态。 我可以使用以下代码使系统范围内的声音静音/取消静音。 但是我注意到当我的应用程序正在运行并且正在播放声音时,我的应用程序会出现
所以我有一个 iframe,其“src”指向一些音乐的 URL。 iframe 被隐藏并自动播放音乐。如何添加一个按钮来使音乐静音? 请注意,音乐来自外部网站。而且 URL 并不指向特定文件。它只是
我正在制作一个小型 Java 应用程序,该应用程序需要以隐藏模式打开 Firefox 浏览器并将其静音。 正如您通过下面的代码看到的,我找到了一种隐藏浏览器的方法。然而,我在弄清楚如何使浏览器静音以及
我正在为我的应用程序使用 SpeechRecognizer API,每次启动时,它都会播放“哔”声。 我想知道如何将它静音,这样我就可以自己实现一个。 谢谢。 最佳答案 如果您使用按钮来激活和停用识别
我正在创建我的第一个应用程序。我有一个使用以下代码在后台播放音乐的应用程序: var backgroundMusicPlayer = AVAudioPlayer() override func vie
我是一名优秀的程序员,十分优秀!