6

可以说我有以下类结构:

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单元测试中的参数值以检查不同的输出。

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

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

4

2 回答 2

6

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

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";
}
于 2013-07-01T09:56:02.727 回答
2

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

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

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

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

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

于 2013-07-01T10:09:44.463 回答