假设我有以下类结构:
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
,以检查不同的输出。
但是,我的第一个结构更清晰,因为我没有不必要地将变量值作为参数传递给方法。
有没有办法充分利用这两个世界,而不必为了进行单元测试而妨碍我的结构?
答案 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());
}
然后,测试中的代码和测试本身都使用相同的应用程序设置源。这意味着源可以更改,但测试不会中断。希望这会有所帮助。