简而言之:以下代码中调用的模式是什么,应该如何测试它?
代码的目的是封装 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/