.NET代码2.2的集成测试IHostBuilder(通用主机构建器)

11

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

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

我想构建一些基本的集成测试,以验证优雅的关闭和IoC配置。我希望启动一个TestServer来托管我的IHostBuilder主机。 我不需要提供任何请求服务。

我已经使用了Microsoft.AspNetCore.TestHost中的IWebHostBuilder和TestServer进行了这种操作。但是,IHostBuilder没有支持,只有IWebHostBuilder。https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.testhost.testserver.-ctor?view=aspnetcore-2.2#Microsoft_AspNetCore_TestHost_TestServer__ctor_Microsoft_AspNetCore_Hosting_IWebHostBuilder_

我知道在.NET Core 3.0中,IHostBuilder将替代IWebHostBuilder,并且TestServer将支持此操作。 但是我正在尝试在.NET Core 2.2中实现这一点的方法。


2
为什么需要TestServer?你可以从测试应用程序中构建一个通用主机,使用RunAsync()运行它并测试你想要测试的任何内容。唯一的缺点是你需要在测试应用程序中重复所有的DI注册和配置。 - OlegI
@Olegl,你有例子吗?我想做的一件事是,在主机发送SIGTERM时测试我的应用程序的优雅关闭。不确定如何在完整的集成测试中实现这一点。另一个用例就像我在OP中说的那样,我需要验证.NET Core IoC容器是否正确配置,例如我可以从容器中获取选择的服务,并且应用程序能够正确启动并具有所有所需的依赖项。我已经在ASP.NET Web应用程序和TestHost托管的IWebHostBuilder中完成了这种操作。但是在IHostBuilder中没有看到任何类似的选项。 - Dude0001
你使用 IHostedService 吗? - OlegI
@Olegl 是的,我正在使用实现了 IHostedService 接口的 BackgroundService。 - Dude0001
2
@Dude0001 为了测试 IoC,你可以简单地解析所有已注册的服务(忽略开放式泛型接口,如 IRepository<>)和所有控制器。这应该足够了。而且你不需要运行整个应用程序来完成这个测试。 - Vlad DX
@Dude0001 你能否将你的应用程序的基本最小示例添加到某个地方?(可能只需包括Program.cs和IoC注册文件) - zaitsman
1个回答

0

我知道这可能不是你想要的,但你可以用脚本来测试。

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

test-start-stop.sh:

#!/usr/bin/bash

# Exit on error
# https://dev59.com/SmIk5IYBdhLWcg3wDaYX
set -e

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

# Run in background and save process ID
# https://dev59.com/GnI-5IYBdhLWcg3wVWzv
./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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接