2011-02-01 88 views
5

我們想測試我們對黃瓜的步驟定義。我們希望能夠檢查的一件事是,我們預計失敗的測試實際上會失敗。爲此,我們希望編寫我們知道會失敗的場景,並將它們添加到我們的測試套件中,但標記或以其他方式表示它們,以便當且僅當它們失敗時才「通過」。如何解決這個問題?如何期待黃瓜失敗的步驟和傳遞失敗?

回答

0

您應該測試否定狀態。一個失敗的步驟只是一個傳遞步驟的逆轉。所以做類似的事情:

Then /i should not be true/ do 
    some_value.should_not be_true 
end 

這就是我將如何去測試失敗。您還可以趕上異常和等,並驗證塊事實上確實拋出該異常

lambda do 
    something_that_horks 
end.should raise_error(Specific::Error) 

你根本扭轉你的測試用例的測試,以測試爲陰性結果,而不是陽性結果。

+0

這裏的目的不是爲了測試狀態不正確,則是在狀態不正確時測試測試失敗。換句話說,我們正在測試我們的步驟,而不是測試狀態。 – kerkeslager 2011-02-03 16:57:35

-1

您將-w開關切換到Cucumber命令。

它會輸出正常的格式,但最後它會給出一個總結,詳細說明所有測試用例是否失敗,如果有任何通過它將指定哪些。

0

這是一個非常複雜的例子,但最終結果是一個非常乾淨的方法,期望黃瓜場景失敗。這些只是我正在開發的一個項目中的一小部分組件。創建缺少數據的用戶失敗的原因是因爲我的用戶模型中有一些驗證器。所有的源代碼可以找到here

功能/ step_definitions/before_step.rb

Before("[email protected]") do 
    def assert_cucumber(assersion, msg = "an error was thrown") 
    assert(assersion == true, msg) 
    end 
end 

Before("@fails") do 
    def assert_cucumber(assersion, msg = "an error was thrown") 
    assert(assersion == false, msg) 
    end 
end 

功能/ step_definitions/user_step.rb

Given /^a user with$/ do |params| 
    params = params.rows_hash 
    unless User.find_by({username: params[:username]}) 
    assert_cucumber(User.new(params).save, "could not create user") 
    end 
end 

功能/ user.feature

Scenario: check if userers exsist 
    Given a user with 
    | username | johnsmith    | 
    | email | [email protected] | 
    | password | password    | 
    Then a user with username "johnsmith" 

@fails 
Scenario: create user with missing data 
    Given a user with 
    | username | johndoe | 
    Then a user with username "johndoe"