2010-09-27 86 views
0

我一直在使用TDD/SSR。我試圖轉換到BDD:上下文,因爲,和斷言。BDD:何時/在哪裏設置存根?

我正在使用Rhino Mocks來隔離,現在我正忙於語法。這裏就是我這麼遠(注:ContextSpecification class source):

public static class DocumentIdAdapterTests { 
    public class DocumentIdAdapterContext : ContextSpecification { 
     protected IDocumentIdAdapter _documentIdAdapter; 
     protected ISettings _settingsMock; 
     protected override void Context() { 
      _settingsMock = MockRepository.GenerateMock<ISettings>(); 
      _documentIdAdapter = new DocumentIdAdapter(_settingsMock); 
     } 
    } 

    [TestClass] 
    public class when_single_document_url_is_created : DocumentIdAdapterContext { 
     protected override void BecauseOf() { 
      _settingsMock.Stub(x => x.DocumentServiceBaseUrl).Return("fooOutput"); 
      _documentIdAdapter.GetDocumentServiceSingleDocumentUrl("fooInput"); 
     } 

     [TestMethod] 
     public void the_settings_should_provide_the_document_service_base_url() { 
      _settingsMock.AssertWasCalled(x => { var ignored = x.DocumentServiceBaseUrl; }); 
     } 
    } 
} 

我應該在哪裏設置我的存根?例如,我應該在哪裏存儲DocumentServiceBaseUrl屬性將返回的值?我現在正在使用我的BecauseOf方法,但是我應該在我的Context方法中執行此操作嗎?

+0

我可以詳細說明我對這個BDD類(場景vs行爲等)中Context和BecauseOf *是什麼的理解,如果這有助於潛在的回答者,但我試圖讓問題保持簡短。 – lance 2010-09-27 17:13:13

+0

我想將存根設置放在我的BecauseOf中,這樣我就可以根據每個場景更改它們,而不必每次都有一個新的上下文基類,但是這是壞的,我在想。實際上,我必須爲每個我測試SUT的場景定義一個獨特的上下文。如果*這些上下文類都是從一個基類擴展而來的,那麼很好,但是我必須爲每個測試SUT的場景設置一個獨特的上下文類。我現在在想嗎? – lance 2010-09-27 17:41:20

回答

0

它取決於哪些上下文會影響你班級的行爲,哪些是你班級操作的必要條件。

如果您始終以特定的上下文開頭(例如,您的文檔服務始終位於特定的URL),那麼您可以在構造函數或設置方法中進行設置。

如果你的上下文影響你的行爲(你稱爲becauseOfs),那麼每個上下文將需要一個新的場景。這通常是驅動場景的驅動因素 - 產生不同結果的上下文組合(斷言)。

一個很好的BDD技巧是尋找不同的上下文。想一想,「我的代碼應該總是這樣做嗎?有沒有一種背景會產生不同的結果?」這爲您提供了很好的對話初學者,用於發現您對代碼不瞭解的任何內容,並允許您爲每個新行爲方面提供示例(單元測試)。