2010-12-13 77 views
6

我想了解使用rspec測試多步驟工作流程的習慣用法或最佳實踐。在rspec中測試多步驟工作流程

讓我們作爲一個例子的「購物車」系統,其中當用戶提交到籃下,我們沒有使用HTTPS購買過程中可能會

  1. ,重定向到https
  2. 當用戶提交到籃子,我們使用的是HTTPS並沒有什麼餅乾,創建並顯示一個新的籃子裏,當用戶提交籃發送回一個cookie
  3. ,我們使用的是HTTPS,有一個有效的cookie和新的項目是不同的產品比第一個項目,添加一條線到籃子並顯示兩條線
  4. 當用戶提交到購物籃並且我們使用的是https並且有一個有效的cookie,並且新項目用於與前一個產品相同的產品時,增加該購物籃的數量並顯示兩行
  5. 當用戶單擊「結帳」籃子頁面上,並使用HTTPS並有一個cookie和籃非空和...
  6. ...

我讀過http://eggsonbread.com/2010/03/28/my-rspec-best-practices-and-tips/,其職責IA每個「它阻止」應該只包含一個斷言:不是進行計算,然後在同一個塊中測試多個屬性,在上下文中使用「before」來創建(或檢索)測試中的對象並將其分配給@some_instance_variable,然後將每個屬性測試寫爲一個單獨的塊。這有點幫助,但是在上面所述的測試步驟n需要執行步驟[1..n-1]的所有設置的情況下,我發現自己要麼複製設置代碼(顯然不好),要麼創建大量輔助函數越來越笨拙的名字(def create_basket_with_three_lines_and_two_products),並在每一步的前一個塊中連續調用它們。

如何做到這一點不太冗長/繁瑣任何提示嗎?我很欣賞這個想法背後的一般原則,即每個例子不應該依賴於前面例子留下的狀態,但是當你測試一個多步驟的過程並且在任何步驟都會出錯的時候,爲每一步設置上下文是不可避免地會需要重新運行所有前面的n個步驟中的設置,所以......

回答

2

這裏是一個可能的方法 - 定義創建每個步驟的必需狀態的對象和直傳它對於每個連續的。基本上你需要模擬/存根方法調用所有的設置條件:

class MultiStep 
    def initialize(context) 
    @context = context 
    end 

    def init_vars 
    @cut = @context.instance_variable_get(:@cut) 
    end 

    def setup(step) 
    init_vars 
    method(step).call 
    end 

    def step1 
    @cut.stub(:foo).and_return("bar") 
    end 

    def step2 
    step1 
    @cut.stub(:foo_bar).and_return("baz_baz") 
    end 
end 

class Cut # Class Under Test 
    def foo 
    "foo" 
    end 
    def foo_bar 
    "foo_bar" 
    end 
end 

describe "multiple steps" do 
    before(:each) do 
    @multi_stepper = MultiStep.new(self) 
    @cut = Cut.new 
    end 

    it "should setup step1" do 
    @multi_stepper.setup(:step1) 
    @cut.foo.should == "bar" 
    @cut.foo_bar.should == "foo_bar" 
    end 

    it "should setup step2" do 
    @multi_stepper.setup(:step2) 
    @cut.foo.should == "bar" 
    @cut.foo_bar.should == "baz_baz" 
    end 

end 
1

肯定來不及了OP,但是這可能是方便別人 - RSpec的步驟寶石似乎對這個確切情況要建:https://github.com/LRDesign/rspec-steps

看看https://github.com/railsware/rspec-example_stepshttps://github.com/jimweirich/rspec-given也是值得的。我決定採用rspec步驟,但我很忙,這些其他選項實際上可能對我所知道的更好。

+0

現在您已經使用rspec-steps gem,您是否滿意解決多步驟尊重問題的結果? – Angela 2015-05-11 04:16:55

+0

@Angela:恩,好問題。我簡單地使用了它,但小組的其他成員並不熱衷於此,所以我們最終放棄了它,並有更多的重複。我*認爲*理由是我們需要更多的可讀性,但這是一個很長的時間....在這一點上,我發現真正的集成測試是最簡單的,只是寫作一個大功能,每個測試只執行一次「工作流程」。不是最習慣或流行的方法,但我喜歡可讀性。 – Nerdmaster 2015-05-11 15:56:58

+0

我在rspec中只看到一個'describe'? – Angela 2015-05-13 05:54:47