c# - 所有的类(class)都应该是可测试的吗?

标签 c# unit-testing mocking

我正在尝试为我创建的新项目编写单元测试,但我遇到了一个问题,我无法弄清楚我打算编写的类实际上是如何可测试的。下面我简化了我试图编写的类,让您了解我想要实现的目标。

所以我有一个 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/

相关文章:

python - 使用模拟测试构造函数

c# - 调用方法时过多的汇编说明

c# - 查询具有可为空 datetimetimeoffset 属性的链接实体时出现问题

swift - 如果未调用闭包,我如何使 XCTest 失败?

python - "RuntimeError: working outside of application context"使用 py.test 进行单元测试时

javascript - $ 未在 mocha chai 测试脚本中定义

c# - 用作基类/接口(interface)时验证 Moq 方法调用

c# - 查询在模拟 Dbcontext 上为 null 的实体关系

c# - 在 Xamarin Forms 中添加按钮的最佳方式是什么?

c# - 如何在 Visual Studio 中生成项目的设置设计器文件