此問題與RSpec手冊中的codebreaker示例有關。 請參閱此處的代碼:https://github.com/kristianmandrup/rspec-book-codebreaker/tree/master/features如何使用Cucumber或SpecFlow處理來自控制檯的交互式輸入
我想知道是否有人爲解碼器遊戲製作了完整的解決方案。
我很想看看如何測試外部循環,它決定遊戲是否應該繼續。
的功能可能看起來像這樣
- 你找到了密碼!
- 你想再試一次嗎? :N
- 再見
如果用戶選擇「Y」隨後的比賽再次開始。 我有興趣看到場景和步驟定義。 難道是這樣的:
Scenario: user finds secret code
Given the secret code is "1234"
When I guess "1234"
Then I should see "You found the secret code!"
And I should see "Would you like to try again?"
另一個spec文件:
Background: Found secret code
Given the secret code is "1234"
And I guess "1234"
Scenario: user chooses to quit the game
Given I see "Would you like to try again?"
When I enter "n"
Then I should see "Good-bye"
Scenario: user chooses to continue with the game
Given I see "Would you like to try again?"
When I enter "y"
Then I should see "Enter guess:"
如上,目前雙(模擬)輸出對象傳入的鏈接看到所有輸出由該捕獲double,然後用於斷言。輸入有點不同。當應用程序顯示「您想再試一次嗎?」時,輸入模擬需要回復「y」或「n」,具體取決於測試。也許這不是要走的路嗎?
有類似於模仿用戶猜測的東西,即步驟定義如下所示:
When /^I guess "([^\"]*)"$/ do |guess|
@game.guess(guess)
end
這是當前的主要方法:
def generate_secret_code
options = %w[1 2 3 4 5 6]
(1..4).map { options.delete_at(rand(options.length))}.join
end
game = Codebreaker::Game.new(STDOUT)
secret_code = generate_secret_code
at_exit { puts "\n***\nThe secret code was: #{secret_code}\n***" }
game.start(secret_code)
while guess = gets.chomp
game.guess(guess)
end
沒有任何試驗中加入外環。我想知道如何處理gets.chomp - 我該如何「嘲笑」那種行爲?這是如何處理控制檯的交互輸入?
我實際上使用SpecFlow和C#,如果可能的話,爲C#提供一個解決方案。 Ruby的解決方案還可以幫助...
感謝
謝謝,我還有一些問題。我已經提出了我的原始問題,試圖給出更多的上下文。你能解釋一下如何使用流對象來測試上面的「while guess = gets.chomp」代碼嗎?我理解傳遞模擬\存根對象的想法,在這種情況下,它有點令人困惑。這是因爲通過這一點,我已經創建了「遊戲」對象。我不確定我是否正確解釋問題。你看到我在駕駛什麼嗎?我真的很感謝黃瓜步驟的定義。 – Daryn 2012-01-03 22:07:38