繁体   English   中英

单元测试无效方法

[英]Unit testing a void method

我了解您可以通过检查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字段。

在该类的其他地方configData使用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);
}

在测试中,请尝试仅测试公共交互,因为深入该类,因为必须读取私有字段的值,这意味着您的课程不友好。

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

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

顺便说一句,我强烈建议您遵循.NET命名约定,以大写字母开头的方法名称。 (我也敦促您将您的领域设为私有而非内部...)

单元测试从根本上说“给出了这个输入,确认了这个事情发生了”,但是并不能代替验证您的应用程序处于有效状态。

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

如果配置上还需要其他任何验证,则不会引发任何异常,这应在类本身中处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM