2011-09-06 38 views
0

我在做文件转换这是多发步骤的过程。 STEAP1的输出作为输入传递给STEP2。 STEP2的输出是分配给Context.FinalOutput属性的最终输出。由于最终输出是流,我希望调用者决定使用哪个流。这就是为什么调用者将通过流作为上下文的一部分。 我只是想知道,我用Rhino Mocks写的测试是正确的?如何使用Rhino Mocks进行流式传输?

namespace Test 
{ 
    public interface IContextInfo 
    { 
     // Input parameters here 

     // Output parameter 
     Stream FinalOutput { get; set; } 
    } 

    public interface IStep1 
    { 
     void DoStep1(IContextInfo contextInfo, Stream outputOfStep1); 
    } 

    public interface IStep2 
    { 
     void DoStep2(Stream outputOfStep1, Stream outputOfStep2); 
    } 

    public interface IController 
    { 
     void Execute(); 
    } 

    public class MyController : IController 
    { 
     IContextInfo _contextInfo = null; 
     IStep1 _step1 = null; 
     IStep2 _step2 = null; 

     public MyController(IContextInfo contextInfo, IStep1 step1, IStep2 step2) 
     { 
      _contextInfo = contextInfo; 
      _step1 = step1; 
      _step2 = step2; 
     } 

     public void Execute() 
     { 
      using (Stream outputOfStep1 = new MemoryStream()) 
      { 
       this._step1.DoStep1(_contextInfo, outputOfStep1); 
       this._step2.DoStep2(outputOfStep1, this._contextInfo.FinalOutput); 
      } 
     } 
    } 

    [TestClass] 
    public class ControllerTests 
    { 
     [TestMethod] 
     public void Controller_Execute() 
     { 
      MockRepository mock = new MockRepository(); 
      var context = mock.Stub<IContextInfo>(); 
      var step1 = mock.Stub<IStep1>(); 
      var step2 = mock.Stub<IStep2>(); 

      var outputOfStep1 = mock.StrictMock<Stream>(); 
      context.FinalOutput = mock.StrictMock<Stream>(); 

      step1.Expect(x => x.DoStep1(context, outputOfStep1)).IgnoreArguments(); 
      step2.Expect(c => c.DoStep2(outputOfStep1,context.FinalOutput)).IgnoreArguments(); 
      mock.ReplayAll(); 

      var controller = new MyController(context, step1, step2); 
      controller.Execute(); 

      //Assert 
      Assert.IsNotNull(controller); 
      mock.VerifyAll(); 
     } 
    } 
} 
+0

它是什么,你想测试?你得到编译错误吗?运行测试时出错? – PatrickSteele

回答

0

根据您的测试是如何组成的,它看起来好像你测试的目的是验证类两个依赖_step1_step2都在Execute()方法正确调用。这是写好的第一个测试。

不幸的是,你的测试不正确测试条件。既然你是在_step1_step2设定的期望,你需要改变他们存根嘲笑

此外,由于你是不是在你的输出设定的期望,你应该改变他们从嘲笑到存根或完全删除它们,因为你在呼唤IgnoreArguments()

[TestMethod] 
public void Execute_IsCalled_Step1AndStep2AreCalled() 
{ 
    //Arrange 
    MockRepository mock = new MockRepository(); 
    var context = mock.Stub<IContextInfo>(); 

    var step1 = mock.StrictMock<IStep1>(); 
    var step2 = mock.StrictMock<IStep2>(); 

    step1.Expect(x => x.DoStep1(null, null)).IgnoreArguments(); 
    step2.Expect(c => c.DoStep2(null, null)).IgnoreArguments(); 
    mock.ReplayAll(); 

    //Act 
    var controller = new MyController(context, step1, step2); 
    controller.Execute(); 

    //Assert 
    mock.VerifyAll(); 
} 

我已经做了一些额外的为清楚起见变化:

我改名为你的方法更恰当地描述测试。我通常遵循以下模式:MethodUnderTest_Condition_ExpectedResult()。此外,我删除了Assert.IsNotNull(controller);,因为它不适用于正在测试的条件。

有可能要编写针对这个方法肯定是更多的测试(确保第一步的输出是第二步的输入,例如)。最重要的是,记住要在测试中明确你正在测试的是什么,并且尽力一次测试一个条件。