【问题标题】:Integration testing .NET Code 2.2 IHostBuilder (Generic Host Builder)集成测试 .NET Code 2.2 IHostBuilder(通用主机生成器)
【发布时间】:2019-12-27 06:49:25
【问题描述】:

我正在使用 .NET Core 2.2 IHostBuilder(通用主机生成器)构建一个控制台应用程序,将消息流应用程序作为 BackgroundService (IHostedService) 运行。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2

这不是通常用于托管 ASP.NET Core Web 应用程序的 IWebHostBuilder。

我想构建一些基本的集成测试来验证正常关闭和 IoC 配置。我想启动一个托管我的 IHostBuilder 主机的 TestServer。我不需要处理任何类型的请求。

我已经在 Microsoft.AspNetCore.TestHost 中使用 IWebHostBuilder 和 TestServer 完成了这种事情。但是,不支持 IHostBuilder,只有 IWebHostBuilder。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.testhost.testserver.-ctor?view=aspnetcore-2.2#Microsoft_AspNetCore_TestHost_TestServer__ctor_Microsoft_AspNetCore_Hosting_IWebHostBuilder_

我知道 IHostBuilder 将替换 .NET Core 3.0 中的 IWebHostBuilder 并且那里的 TestServer 将支持这一点。试图在 .NET Core 2.2 中找到一种方法。

【问题讨论】:

  • 为什么需要TestServer?您可以从您的测试应用程序构建一个通用主机,使用RunAsync() 运行它并测试您想要测试的任何内容。唯一的缺点是您需要在测试应用程序中重复所有 DI 注册和配置
  • @Olegl 你有例子吗?我想做的一件事是在主机发送 SIGTERM 时测试我的应用程序的正常关闭。不知道如何通过完整的集成测试来做到这一点。另一个用例是我在 OP 中所说的,我需要验证 .NET Core IoC 容器是否配置正确,例如我可以从包含中获取选择的服务,并且应用程序可以使用所有需要的依赖项正确启动。我在 ASP.NET Web 应用程序和托管在 TestHost 中的 IWebHostBuilder 中做过这种事情。没有看到任何类似的 IHostBuilder 选项。
  • 你使用 IHostedService 吗?
  • @Olegl 是的,我正在使用实现 IHostedService 的 BackgroundService
  • @Dude0001 为了测试 IoC,您可以简单地解析所有已注册的服务(忽略开放的通用接口,如 IRepository<>)和所有控制器。应该足够了。而且您不需要为此运行整个应用程序。

标签: c# integration-testing .net-core-2.2


【解决方案1】:

我知道这可能不是您的想法,但您可以使用脚本对其进行测试。

它会检查应用程序在启动时没有崩溃,并且可以使用SIGTERM 停止它。

test-start-stop.sh:

#!/usr/bin/bash

# Exit on error
# https://stackoverflow.com/questions/19622198/what-does-set-e-mean-in-a-bash-script
set -e

# Publish binary
# https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
dotnet publish -r linux-x64 -o publish app

# Run in background and save process ID
# https://stackoverflow.com/questions/1908610/how-to-get-pid-of-background-process
./app/publish/app & 
APP_PID=$!

# Wait until app is started
sleep 5s

# Send SIGTERM
kill -SIGTERM $APP_PID

# Wait for process exit
wait $APP_PID

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多