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

Cur*_*urt 3 c# unit-testing

可以说我有以下类结构:

private string GlobalVariable = "foo";

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

public string Baz()
{
    return GlobalVariable + "qux";
}
Run Code Online (Sandbox Code Playgroud)

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

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

private string GlobalVariable = "foo";

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

public string Baz(string globalVar)
{
    return globalVar + "qux";
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

mus*_*fan 5

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

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

public string Baz(string globalVar)
{
    return globalVar + "qux";
}
Run Code Online (Sandbox Code Playgroud)

这里的好处是你仍然有你的无参数方法,可以从代码中调用,而不必担心每次都指定值,但是你有测试的重载,并且在你需要使用的情况下不同的价值.

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


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

public string Baz(string globalVar = null)
{
    if(string.IsNullOrEmpty(globalVar))
        globalVar = GlobalVariable;
    return globalVar + "qux";
}
Run Code Online (Sandbox Code Playgroud)

  • 重载听起来像是个好主意,它会给我两者带来的好处.但是我必须确保记录良好,否则看到在类中没有可见用的重载方法可能会让其他开发人员感到困惑!这种情况的标准做法是什么?这似乎是单元测试的常见问题,但我找不到任何对先前解决方案的引用. (2认同)