带不同配置值的单元测试静态构造函数

MNI*_*NIK 5 c# unit-testing static-constructor

我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我这里有两个问题:
1.我不知道如何在单独的应用程序域中运行每个测试,
2.如何我要在运行时更改配置设置吗?

有人可以帮我解决这个问题吗?或者谁有更好的解决方案?谢谢。

sel*_*ary 0

您不需要测试 .Net 是否能够从配置文件加载数据。
相反,尝试集中精力测试你自己的逻辑。

更改您的类,以便它从其构造函数(或通过属性)获取配置值,然后像使用任何其他依赖项一样对其进行测试。

一路走来,您的班级也朝着SRP方向发展。

根据配置加载 - 将此逻辑集中在一个单独的非静态类中。


编辑:
将配置逻辑分离到另一个类中。像这样的东西:

public static class ConfigurationLoader
{
    static ConfigurationLoader()
    {
        // Dependency1 = LoadFromConfiguration();
        // Dependency2 = LoadFromConfiguration();
    }

    public static int Dependency1 { get; private set; }
    public static string Dependency2 { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您实例化您的类时,将其注入依赖项:

public class MyClass
{
    private readonly int m_Dependency1;
    private readonly string m_Dependency2;

    public MyClass(int dependency1, string dependency2)
    {
        m_Dependency1 = dependency1;
        m_Dependency2 = dependency2;
    }

    public char MethodUnderTest()
    {
        if (m_Dependency1 > 42)
        {
            return m_Dependency2[0];
        }

        return ' ';
    }
}

public class MyClassTests
{
    [Fact]
    public void MethodUnderTest_dependency1is43AndDependency2isTest_ReturnsT()
    {
        var underTest = new MyClass(43, "Test");
        var result = underTest.MethodUnderTest();
        Assert.Equal('T', result);
    }
}

...

var myClass = new MyClass(ConfigurationLoader.Dependency1, ConfigurationLoader.Dependency2);
Run Code Online (Sandbox Code Playgroud)

您可以继续使用 IOC 容器,但是使用不同输入测试 MyClass 的问题可以通过这个简单的可测试设计解决。