使用全局变量的单元测试方法

本文关键字:单元 测试方法 全局变量 | 更新日期: 2023-09-27 18:20:28

假设我有以下类结构:

private string GlobalVariable = "foo";
public void MainMethod()
{
    string bar = Baz();
}
public string Baz()
{
    return GlobalVariable + "qux";
}

我希望使用不同的GlobalVariable值对Baz()进行单元测试。但是,由于GlobalVariable只是在方法中调用,而不是作为参数传递给它,所以我无法在单元测试方法中设置它。

因此,我考虑将我的结构更改为:

private string GlobalVariable = "foo";
public void MainMethod()
{
    string bar = Baz(GlobalVariable);
}
public string Baz(string globalVar)
{
    return globalVar + "qux";
}

通过这种方式,我现在可以在单元测试中更改参数值globalVar,以便检查不同的输出。

然而,我的第一个结构更干净,因为我不会不必要地将变量值作为参数传递给方法。

有没有一种方法可以两全其美,而不必为了运行单元测试而阻碍我的结构?

使用全局变量的单元测试方法

我很想有一个单独的重载方法,然后我可以有一个带参数的方法和一个不带。。。

public string Baz()
{
    return Baz(GlobalVariable);
}
public string Baz(string globalVar)
{
    return globalVar + "qux";
}

这里的好处是,您仍然可以使用无参数方法,该方法可以从代码中调用,而不必担心每次都要指定值,但这样您就有了测试的过载,而且在您确实需要使用不同值的情况下。

尽管您仍然无法使用不同的值来测试第一个方法,但我认为可以放心地假设只测试第二个函数就足够了。


或者,如果你使用的是C#4.0,你可以使用可选的参数:

public string Baz(string globalVar = null)
{
    if(string.IsNullOrEmpty(globalVar))
        globalVar = GlobalVariable;
    return globalVar + "qux";
}

如果全局变量是不可变的(比如和应用程序设置),我就不会使用重载。相反,我会访问测试代码中的应用程序设置。所以,我会这样说:

public string Baz()
{
    return ApplicationSetting.GlobalVariable + "qux";
}

然后在测试中,我会做这样的事情:

[Test]
public void Test()
{
     string expected = ApplicationSetting.GlobalVariable + "qux";
     Assert.AreEqual(expected, Baz());
}

然后,被测试的代码和测试本身都使用相同的应用程序设置源。这意味着源可以更改,但测试不会中断。希望这能有所帮助。