gpt4 book ai didi

c# - 如何单元测试方法调用 IConfiguration.Get 扩展

转载 作者:太空宇宙 更新时间:2023-11-03 19:39:50 27 4
gpt4 key购买 nike

我有一个非常简单的方法需要进行单元测试。

public static class ValidationExtensions
{
public static T GetValid<T>(this IConfiguration configuration)
{
var obj = configuration.Get<T>();
Validator.ValidateObject(obj, new ValidationContext(obj), true);
return obj;
}
}

问题是 configuration.Get<T>是静态扩展方法,不属于 IConfiguration .我无法更改该静态方法的实现。

我在想,也许最简单的方法是创建内存配置提供程序?但我不知道是否可以在不将其绑定(bind)到网络主机的情况下创建一个。

最佳答案

配置模块独立于虚拟主机相关功能。

您应该能够创建内存配置以进行测试,而无需将其绑定(bind)到 Web 主机。

查看以下示例测试

public class TestConfig {
[Required]
public string SomeKey { get; set; }
[Required] //<--NOTE THIS
public string SomeOtherKey { get; set; }
}

//...

[Fact]
public void Should_Fail_Validation_For_Required_Key() {
//Arrange
var inMemorySettings = new Dictionary<string, string>
{
{"Email:SomeKey", "value1"},
//{"Email:SomeOtherKey", "value2"}, //Purposely omitted for required failure
//...populate as needed for the test
};

IConfiguration configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)
.Build();

//Act
Action act = () => configuration.GetSection("Email").GetValid<TestConfig>();

//Assert
ValidationException exception = Assert.Throws<ValidationException>(act);
//...other assertions of validation results within exception object
}

在我看来,这将接近集成测试,但理想情况下,您只是使用依赖于框架的功能来隔离扩展方法的测试。

关于c# - 如何单元测试方法调用 IConfiguration.Get<T> 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55134533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com