2011-09-06 65 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);,因爲它不適用於正在測試的條件。

有可能要編寫針對這個方法肯定是更多的測試(確保第一步的輸出是第二步的輸入,例如)。最重要的是,記住要在測試中明確你正在測試的是什麼,並且盡力一次測試一個條件。