c# - 这种模式叫什么?应该如何测试它?

标签 c# unit-testing design-patterns

简而言之:以下代码中调用的模式是什么,应该如何测试它?

代码的目的是封装 zip 文件上的许多操作(用 C# 编写,尽管该模式与语言无关):

public class ZipProcessor
{
    public ZipProcessor(string zipFilePath) { ... }

    public void Process()
    {
        this.ExtractZip();
        this.StepOne();
        this.StepTwo();
        this.StepThree();
        this.CompressZip();
    }

    private void ExtractZip() { ... }
    private void CompressZip() { ... }
    private void StepOne() { ... }
    private void StepTwo() { ... }
    private void StepThree() { ... }
}

实际的类大约有 6 个步骤,每个步骤都是一个短方法,长 5-15 行。步骤的顺序并不重要,但提取和压缩必须始终分别位于最前面和最后。此外,StepTwo 的运行时间比其余步骤要长得多。

以下是我可以想到的用于测试该类的选项:

  • 仅调用公共(public)Process方法,并且仅检查每个测试方法中的一个步骤的结果(pro:clean,con:慢,因为每个测试方法都会调用 StepTwo,这很慢,即使它不关心 StepTwo 的结果)
  • 使用访问器或包装器直接测试私有(private)步骤(优点:与测试期间运行的内容和实际测试的内容之间的关系简单、清晰,缺点:仍然慢:多次提取和压缩,hacky:需要使用私有(private)访问器或动态包装器,或者将步骤设置为内部才能访问它们)
  • 只有一个测试方法来调用一堆较小的辅助测试方法(优点:快速,对类进行更紧密的建模,缺点:违反“每个测试一个断言”方法”,仍然需要针对不同的场景运行多次,例如 StepOne 根据输入有不同的行为)

最佳答案

我的讨论有点晚了,但这是一种中士方法。

快速谷歌返回“我们在这里将更大的方法称为“sergeant”方法,它基本上调用其他私有(private)方法并对它们进行编码。它可能到处都有代码片段。这些私有(private)方法中的每一个都关于一个特别的事情。这促进了凝聚力并使中士方法读起来像评论”。

至于如何测试它 - 您的示例可能违反了 SRP,因为您有一个 zip 压缩器/解压缩器(一件事),然后是步骤 1/2/3。您可以将私有(private)方法调用提取到其他类中并模拟它们以进行测试。

我不同意责任链在这里很有意义 - 压缩器不需要了解解压缩器(除非它们是同一类)或它进行解压缩的原因。处理类(Step1/2/3)不应该关心它们正在使用的数据之前是否被压缩过等等。

策略模式也没有真正意义 - 仅仅因为您可以交换 extractZip 或 compressZip 的实现并不意味着您拥有策略模式。

关于c# - 这种模式叫什么?应该如何测试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997787/

相关文章:

c# - 这是观察者反模式吗? (有奖金状态机问题)

c# - 将视频上传到 youtube channel 时出错

c# - Visual Studio 中开发人员特定的 app.config/web.config 文件

node.js - 将常见的模拟代码移动到包含 Jest 手动模拟的单独文件中

java - 在没有源代码的情况下使用 Espresso for APK 编写 UI 测试

c# - 如何返回对尚不存在的对象的引用?

asp.net-mvc - ASP.NET MVC : Best practice or design pattern for getting the DTO/EditModel into the Database

c# - 无法创建 SSL/TLS 安全通道适用于 winforms 但不适用于 asp.net

c# - 使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?

java - 测试反射 newInstance 异常