对空方法进行单元测试
本文关键字:单元测试 方法 | 更新日期: 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 方法将引发异常。然后,这将在单元测试中检测到,该测试将失败。
如果配置上需要任何其他验证,除了不抛出异常之外,则应在类本身中处理。