2012-01-03 8 views
1

この質問は、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のソリューションはまた、コンソールアプリケーションを起動し、その標準入出力ストリームに接続することが可能である

    おかげ

  • 答えて

    0

    ...助けるかもしれません。 ProcessStartInfo.RedirectStandardInputのドキュメントの例を参照してください。

    テストをより速くしますが、完全なエンドツーエンドのシステムテストとしては適格ではないクリーナーは、Console.Inの代わりに通常のStreamオブジェクトを使用するようにアプリケーションを幾分再構成することですConsole.Out; main()メソッドは、これらのクラスをアプリケーションの残りの部分に渡すことができます。次に、テストで直接他のメソッドを呼び出し、MemoryStreamオブジェクトを入出力ストリームとして渡すことができます。

    +0

    ありがとう、私はまだいくつかの質問があります。私は元の質問を拡張してより多くの文脈を与えようとしました。上記の 'guess = gets.chomp'コードをテストするためにストリームオブジェクトを使用する方法を説明できますか?私はmock \ stubオブジェクトを渡すという考えを理解していますが、この文脈ではちょっと混乱します。これは私がすでに 'game'オブジェクトを作成していたからです。私は問題を正しく説明しているかどうかはわかりません。私が運転しているものが見えますか?私はキュウリのステップ定義に本当に感謝しています。 – Daryn

    関連する問題