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

时间:2013-07-01 09:38:56

标签: c# unit-testing

假设我有以下类结构:

private string GlobalVariable = "foo";

public void MainMethod()
{
    string bar = Baz();
}

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

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

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

private string GlobalVariable = "foo";

public void MainMethod()
{
    string bar = Baz(GlobalVariable);
}

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

这样我现在可以在单元测试中更改参数值globalVar,以检查不同的输出。

但是,我的第一个结构更清晰,因为我没有不必要地将变量值作为参数传递给方法。

有没有办法充分利用这两个世界,而不必为了进行单元测试而妨碍我的结构?

2 个答案:

答案 0 :(得分:5)

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

public string Baz()
{
    return Baz(GlobalVariable);
}

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

这里的好处是你仍然有你的无参数方法,可以从代码中调用,而不必担心每次都指定值,但是你有超载的测试,也有你做过的事情。需要使用不同的值。

虽然您仍然无法使用不同的值测试第一种方法,但我认为假设只测试第二种功能就足够了。


或者,如果您使用的是C#4.0,则可以改为使用optional parameters

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

答案 1 :(得分:2)

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

public string Baz()
{
    return ApplicationSetting.GlobalVariable + "qux";
}
然后在测试中我会做这样的事情:

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

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