我知道您可以通过检查其效果来单元测试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字段。
答案 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方法将引发异常。然后在单元测试中检测到这将失败。
如果在配置上需要进行任何其他验证,那么不会抛出任何异常,那应该在类本身中处理。