使用全局变量的单元测试方法
本文关键字:单元 测试方法 全局变量 | 更新日期: 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());
}
然后,被测试的代码和测试本身都使用相同的应用程序设置源。这意味着源可以更改,但测试不会中断。希望这能有所帮助。