单元测试void方法

时间:2014-11-12 12:54:15

标签: c# unit-testing

我知道您可以通过检查其效果来单元测试void方法。但是,请查看此代码中的loadConfigFile方法:

    internal XmlDocument configData;

    public ConfigFile()
    {
        configData = new XmlDocument();
    }

    /// <summary>
    /// Load config file into memory
    /// </summary>
    /// <param name="filename">path and filename of config file</param>
    public void loadConfigFile(string filename) 
    {
        if(string.IsNullOrEmpty(filename))
            throw new System.ArgumentException("You must specify a filename");

        try 
        {
            configData.Load(filename);
        }
        catch(Exception ex)
        {
            throw new Exception("Config file could not be loaded",ex);
        }
    }

它将配置文件加载到私有字段 - 需要保持私有,以便开发人员不直接修改该值。相反,修改将通过setConfigValue和getConfigValue方法完成(我认为需要单独测试)。

鉴于此,我如何测试loadConfigFile实际工作?因为我无法访问私人configData字段。

3 个答案:

答案 0 :(得分:6)

该课程的其他地方使用configData

如果你有一个像

这样的方法
public string GetValue()
{
    return configData.GetsomeDataFromThis;
}

然后我建议您进行这样的测试:

public void ReadValueFromLoadedConfigData()
{
    // Arrange.
    const string ExpectedValue = "Whatever";

    var sut = new ConfigFile();

    sut.loadConfigFile(@"C:\PathToTheConfigFile");

    // Act.
    string actual = sut.GetConfigValue();

    // Assert.
    Assert.AreEqual(ExpectedValue, actual);
}

在您的测试中,尝试仅测试公共互动,因为深入课堂,必须阅读私有字段的值,这意味着您的课程不会测试友好。

答案 1 :(得分:4)

您可以测试getConfigValue返回从文件加载的值,基本上。

仅仅因为您在其他测试中测试setConfigValue / getConfigValue并不意味着您无法在loadConfigFile的测试中使用它们。

顺便说一句,我强烈强烈要求您遵循.NET命名约定,以大写字母开始您的方法名称。 (我也敦促你让自己的领域变得私密而不是内部......)

答案 2 :(得分:0)

单元测试基本上是一种说法&#34;给定此输入,验证发生了这种情况&#34;,它不能代替验证您的应用程序处于有效状态。

在该示例中,如果未满足前提条件或加载操作失败,则loadConfigFile方法将引发异常。然后在单元测试中检测到这将失败。

如果在配置上需要进行任何其他验证,那么不会抛出任何异常,那应该在类本身中处理。