c# - 如何单元测试方法调用 IConfiguration.Get延期
问题描述
我有一个非常简单的方法,我需要进行单元测试。
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
. 我无法更改该静态方法的实现。
我在想,也许最简单的方法是创建一个内存配置提供程序?但我不知道是否可以在不将其绑定到网络主机的情况下创建一个。
解决方案
配置模块独立于网络主机相关功能。
您应该能够创建一个内存配置来进行测试,而无需将其绑定到 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
}
在我看来,这将接近于集成测试,但理想情况下,您只是使用依赖于框架的特性来隔离扩展方法的测试。
推荐阅读
- php - 在 AWS 中使用 cognito 调用未定义的成员函数 adminInitiateAuth()
- vba - Inventor API / VBA AutoBendRadius 在 3D 草图上
- r - 如何在不重新调整结果的情况下使用 ggradar
- powershell - foreach 多次返回一个值
- reporting-services - D365 本地报告服务器 Web 门户应用程序 500 内部错误
- pandas - Pandas .any() 每列返回一个布尔值
- websocket - How to wait for variables to change before sending the next content , websocket by reactor-netty
- c# - 如何在 WEB API 的 ASP.NET MVC 控制器级别中启用 CORS?
- ios - How do I access the camera in Swift 4?
- c# - 无法获取未共享记录