首页 > 解决方案 > 如何单元测试方法调用 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. 我无法更改该静态方法的实现。

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

标签: c#unit-testingasp.net-core.net-coreasp.net-core-configuration

解决方案


配置模块独立于网络主机相关功能。

您应该能够创建一个内存配置来进行测试,而无需将其绑定到 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
}

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


推荐阅读