title: What is this pattern called, and how should it be tested?
body: <p>In brief: What is the pattern called in the following code, and how should it be tested?</p>
  
  <p>The purpose of the code is to encapsulates a number of actions on a zip file (written in C#, although the pattern is language independent):</p>
  
  <pre><code>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() { ... }
  }
  </code></pre>
  
  <p>The actual class has around 6 steps, and each step is a short method, 5-15 lines long. The order of the steps is not important, but Extract and Compress must always come first and last respectively. Also, <code>StepTwo</code> takes much longer to run than the rest of the steps.</p>
  
  <p>The following are options I can think of for testing the class:</p>
  
  <ul>
  <li>Only call the public <code>Process</code> method, and only check the result of one step in each test method (<strong>pro</strong>: clean, <strong>con</strong>: slow, because each test method calls <code>StepTwo</code>, which is slow, even though it doesn't care about the result of <code>StepTwo</code>)</li>
  <li>Test the private steps directly using an accessor or wrapper (<strong>pro</strong>: simple, clear relation to what is run during a test and what is actually tested, <strong>con</strong>: still slow: extracts and compresses multiple times, hacky: need to use a private accessor or dynamic wrapper, or make the steps <code>internal</code> in order to access them)</li>
  <li>Have only one test method that calls a bunch of smaller helper test methods (<strong>pro</strong>: fast, models the class more closely, <strong>con</strong>: violates "one assert per test method", would still need to run multiple times for different scenarios, ex. <code>StepOne</code> has different behavior based on input)</li>
  </ul>