Xunit.DependenecyInjection 对 HostApplicationBuilder 的支持
Intro
Xunit.DependencyInjection 最近新增了对于 HostApplicationBuilder 的支持,我们可以使用 HostApplicationBuilder 的编程模式来注册配置和服务
Sample
只需要定义一个 ConfigureHostApplicationBuilder(IHostApplicationBuilder builder) 方法,在这个方法中注册需要的服务配置即可
Startup 示例如下:
public static class Startup
{
public static void ConfigureHostApplicationBuilder(IHostApplicationBuilder builder)
{
builder.Configuration.AddInMemoryCollection(
[
new KeyValuePair<string, string?>("Hello", "World"),
new KeyValuePair<string, string?>("CounterInitValue", "1")
]);
if (Convert.ToInt32(builder.Configuration["CounterInitValue"]) > 0)
{
builder.Services.AddSingleton<IRandom, RandomService>();
}
}
public static void Configure(IConfiguration configuration)
{
Counter = Convert.ToInt32(configuration["CounterInitValue"]);
}
}
在注册服务时如果需要使用到 Configuration 就会简单很多
初始化的操作仍和之前一样,可以放在 Configure 方法中或者自定义一个 HostedService
测试示例如下:
public class HostApplicationBuilderStartupSample(IRandom random)
{
private static int Counter;
[Fact]
public void RandomTest()
{
var value = random.GetValue(2);
Assert.True(value is >= 0 and <= 2);
}
[Theory]
[InlineData(null!)]
public void ConfigurationTest([FromServices]IConfiguration configuration)
{
Assert.NotNull(configuration);
Assert.Equal("World", configuration["Hello"]);
}
[Fact]
public void ConfigureTest()
{
Assert.Equal(1, Counter);
}
}
public interface IRandom
{
int GetValue(int max);
}
public sealed class RandomService : IRandom
{
public int GetValue(int max) => Random.Shared.Next(max);
}

References
-
https://github.com/WeihanLi/XunitDependencyInjection.Samples/blob/main/P5_More/MoreFeatures/HostApplicationBuilderStartupSample.cs -
https://github.com/pengweiqhca/Xunit.DependencyInjection/blob/main/test/Xunit.DependencyInjection.Test/HostApplicationBuilderTest.cs

