2012-01-03 75 views
1

此問題與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的解決方案還可以幫助...

感謝

回答

0

有可能推出一個控制檯應用程序,連接到它的標準輸入和輸出流。請參閱ProcessStartInfo.RedirectStandardInput文檔中的示例。一個更簡潔的方法(這也會使測試更快,但不能作爲完整的端到端系統測試)將有點重構應用程序,以便它使用常規的Stream對象而不是Console.In,而使用常規的Stream對象而不是Console.InConsole.Out; main()方法可以將這些類傳遞給應用程序的其餘部分。然後,您的測試可以直接調用其他方法,並將對象作爲輸入/輸出流傳遞。

+0

謝謝,我還有一些問題。我已經提出了我的原始問題,試圖給出更多的上下文。你能解釋一下如何使用流對象來測試上面的「while guess = gets.chomp」代碼嗎?我理解傳遞模擬\存根對象的想法,在這種情況下,它有點令人困惑。這是因爲通過這一點,我已經創建了「遊戲」對象。我不確定我是否正確解釋問題。你看到我在駕駛什麼嗎?我真的很感謝黃瓜步驟的定義。 – Daryn 2012-01-03 22:07:38

相關問題