简而言之:以下代码中调用的模式是什么,应该如何测试?
代码的目的是在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行。步骤的顺序并不重要,但Extract和Compress必须始终分别排在第一位和最后一位。此外,StepTwo
比其他步骤花费的时间更长。
以下是我可以考虑用于测试课程的选项:
Process
方法,并且只检查每种测试方法中一步的结果(专业:清除, con :慢,因为每个测试方法调用StepTwo
,这很慢,即使它不关心StepTwo
的结果internal
以便访问它们)StepOne
根据输入有不同的行为”答案 0 :(得分:1)
这里没有真正的模式,但你可以重写你的代码以使用策略或责任链模式,正如Paul Michalik所指出的那样。您也可以根据应用程序的需要定制自定义工作流程。使用Chain of Responsibility模式,每个步骤都是它自己的类,您可以独立测试。您可能希望编写一个集成测试,以确保整个过程端到端工作(组件或验收级别测试)。
答案 1 :(得分:1)
我讨论的时间有点晚了,但这是一个警长方法。
快速谷歌回归"我们称这里更大的方法为“警长”#39;方法,它基本上调用其他私有方法并封送它们。它可能有点零碎的代码。这些私有方法中的每一个都是关于一个特定的东西这促进了凝聚力,并使警长方法像评论一样阅读。
至于你如何测试它 - 你的例子可能违反了SRP,因为你有一个zip压缩器/解压缩器(一件事)然后是step1 / 2/3。您可以将私有方法调用提取到其他类中并模拟那些用于测试。
我不同意责任链在这里很有意义 - 压缩器不应该知道解压缩器(除非他们是同一个类)或者他们做的原因减压。处理类(Step1 / 2/3)不应该关心他们之前正在处理的数据是否已被压缩等。
策略模式也没有意义 - 只是因为你可以交换extractZip或compressZip的实现并不意味着你有一个策略模式。
答案 2 :(得分:0)
考虑将其拆分为2+类 - ExtractZip / Compress和process或1类ExtractZip / Compress with delegate in the middle。
答案 3 :(得分:0)
这是一个Strategy。根据您的测试场景,您可以从ProcessorMock
派生(或者如果它是一个接口,则实现它)并覆盖与正确的存根测试无关的方法。但是,通常情况下,这种情况的灵活模式是Chain of Responsibility ......