我正在尝试为我创建的新项目编写单元测试,但我遇到了一个问题,我无法弄清楚我打算编写的类实际上是如何可测试的。下面我简化了我试图编写的类,让您了解我想要实现的目标。
所以我有一个 XML 解析器,它将简单地从给定的 URL 访问 XML 文件,提取我需要的数据并将其作为对象返回。所以我的代码看起来像这样(验证和填充尚未完成,但你明白了):
public UserDetails ParseUserDetails(string request, string username, string password)
{
var response = new XmlDocument();
response.Load(string.Format(request + "?user={0}&password={1}", username, password));
// Validation checks
return new UserDetails { // Populate object with XML nodes };
}
目前我的类(class)不可测试。我无法模拟负载以抛出 WebException 以查看我的类如何处理错误,并且在我通过有效的 URL 之前,它总是会在我针对此类运行测试时抛出异常。我也无法测试从类返回的数据,因为我无法模拟 XML 文档,因为它是从另一个 URL 加载的。
我可以将其拆分为一个可模拟的对象,该对象从 URL 中检索 XML 并将其命名为 IXmlDocumentLoader 之类的名称,但后来我遇到了同样的问题,我有一个这样的类:
public class XmlDocumentLoader : IXmlDocumentLoader
{
public XmlDocument LoadXmlDocument(string request, string username, string password)
{
var response = new XmlDocument();
response.Load(string.Format(request + "?user={0}&password={1}", username, password));
return response;
}
}
这将使 ParseUserDetails 方法更易于测试,但现在类 XmlDocumentLoader 不可测试。那么我只是将问题转移到别处了吗?我的问题是真的所有类都必须是可测试的还是我误解了单元测试?
最佳答案
这肯定是一个“意见”问题,因此,可能会被关闭。
但我会给你一个建议。
拆分一切。使用“一个对象应该只做一件事”的原则。下载文件是一回事,验证它是另一回事。如果将两者分开,则可以对两者进行测试。
您可以在通用文件(不一定是生产站点)上测试您的下载系统,并测试系统是否正常工作。您可以提供一个“假文件”来测试验证,它也不一定是生产文件。
这两个测试都会让您了解您的代码在多大程度上按预期工作。
关于c# - 所有的类(class)都应该是可测试的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27359795/