对空方法进行单元测试

本文关键字:单元测试 方法 | 更新日期: 2023-09-27 18:30:16

我知道您可以通过检查其效果来对 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使用?

如果,比如说,你有一个像

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 方法将引发异常。然后,这将在单元测试中检测到,该测试将失败。

如果配置上需要任何其他验证,除了不抛出异常之外,则应在类本身中处理。