この質問は、RSpecの書籍にあるコード・ブリーカーの例に関連しています。 コードを参照してください:https://github.com/kristianmandrup/rspec-book-codebreaker/tree/master/featuresCucumberまたは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:"
上記のリンクで見られるように、現在の二重(モック)出力オブジェクトが渡されているすべての出力は、このによって捕捉されます。アサーションで使用されます。入力は少し異なります。アプリケーションが「もう一度やり直しますか?」と表示されたら、テストに応じて、入力模擬は「y」または「n」で返答する必要があります。おそらくこれはそれについて行く方法ではありませんか?
は、ユーザーが推測模倣のようなものがあり、そのステップの定義は次のようになります。
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
外側のループは、任意のテストをせずに追加されました:
はWhen /^I guess "([^\"]*)"$/ do |guess|
@game.guess(guess)
end
これは、現在の主要な方法であり、 。私はgets.chompに対処する方法を知りたいです - どうすればその行動を模倣できますか?これはコンソールからの対話型入力を処理する方法ですか?
私は実際にはSpecFlowとC#を使用していますが、可能であればC#のソリューションを提供しています。 A Rubyのソリューションはまた、コンソールアプリケーションを起動し、その標準入出力ストリームに接続することが可能である
おかげ
ありがとう、私はまだいくつかの質問があります。私は元の質問を拡張してより多くの文脈を与えようとしました。上記の 'guess = gets.chomp'コードをテストするためにストリームオブジェクトを使用する方法を説明できますか?私はmock \ stubオブジェクトを渡すという考えを理解していますが、この文脈ではちょっと混乱します。これは私がすでに 'game'オブジェクトを作成していたからです。私は問題を正しく説明しているかどうかはわかりません。私が運転しているものが見えますか?私はキュウリのステップ定義に本当に感謝しています。 – Daryn