《Cucumber:行為驅動開發指南》——2.5 運行程序
本節書摘來自異步社區《Cucumber:行為驅動開發指南》一書中的第2章,第2.5節,作者:【英】Matt Wynne , 【挪】Aslak Hellesy著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.5 運行程序
接下來我們實現下一個步驟,編輯 features/step_definitions/calculator_ steps.rb,修改第二個步驟定義如下:
下載first_taste/04/features/step_definitions/calculator_steps.rb
When /^the calculator is run$/ do
@output = `ruby calc.rb #{@input}`
raise('Command failed!') unless $?.success?
end
這段代碼試圖運行我們的計算器程序calc.rb,同時傳入上一個步驟保存下來的輸入,並用另一個實例變量保存輸出。接下來它檢查一個名字很特別的(實際上是很隱晦的)Ruby變量$?,來核實命令是否成功運行了,如果運行失敗則拋出一個錯誤。記住,如果步驟定義拋出一個錯誤,Cucumber就會將步驟標記為失敗,這就是實現這個目的最簡單的方法。
這時我們運行Cucumber,應該就能看到它真正去嚐試運行計算器了:
Feature: Adding
Scenario: Add two numbers
Given the input "2+2"
ruby: No such file or directory -- calc.rb (LoadError)
When the calculator is run
Command failed! (RuntimeError)
./features/step_definitions/calculator_steps.rb:10
features/adding.feature:5
Then the output should be "4"
Failing Scenarios:
cucumber features/adding.feature:3
1 scenario (1 failed)
3 steps (1 failed, 1 skipped, 1 passed)
0m0.026s
這次步驟失敗了,因為我們還沒有可運行的calc.rb程序。你應當看到Cucumber在步驟下麵將拋出錯誤所產生的輸出都用紅色標亮了,這能幫助你定位問題。
你可能會想,明知calc.rb這個文件還不存在,卻依然編寫代碼試圖去運行該程序,這樣做有點奇怪。我們是故意這麼做的,因為我們想確保在深入到解決方法的實現之前擁有一個功能完備的測試。基於這條紀律編寫測試意味著我們可以信任測試,因為我們看到這些測試失敗了,當測試通過時我們就可以滿懷信心地認為任務真的完成了。對於我們所謂的由外向內開發,這種優雅的節奏是其中的重要部分,初看起來這好像有點奇怪,我們希望通過本書展現這種開發方式的一些顯著的益處。
由外向內開發還有另外一個好處:在未花任何精力實現計算器之前,我們就有機會從用戶角度考慮計算器的命令行接口。而在這個階段,如果我們意識到接口的一些問題,是非常容易做出改變的。
最後更新:2017-06-05 12:01:54