2017-08-10 10 views
1

tic-tac-toeボードの表示をテストするための仕様を書こうとしています。私は方法captureを使用していますが、仕様を実行するとエラーが発生します。私はメソッド呼び出しの出力を取得するためにキャプチャを使用しています。 https://apidock.com/rails/Kernel/capture は、ここに私の方法である:未定義のメソッドRSpecのキャプチャ

def display_board 
    puts " #{grid[0]} | #{grid[1]} | #{grid[2]} " 
    puts "-----------" 
    puts " #{grid[3]} | #{grid[4]} | #{grid[5]} " 
    puts "-----------" 
    puts " #{grid[6]} | #{grid[7]} | #{grid[8]} " 
    end 

はここに私のRSpecのテストです:

context "#display_board" do 
    output = capture(:stdout) { board.display_board} 
    rows = output.split("\n") 
    binding.pry 
    expect(rows[0]).to eq(" | | ") 
    expect(rows[1]).to eq("-----------") 
    expect(rows[2]).to eq(" | | ") 
    expect(rows[3]).to eq("-----------") 
    expect(rows[4]).to eq(" | | ") 
    end 
+0

具体的には、エラーは何ですか? – struthersneil

+0

'' 'NoMethodError: RSpec :: ExampleGroup :: Board :: DisplayBoard:Class'''のための未定義メソッド' capture ' –

+0

'#capture'は以前はActiveSupportから利用可能でしたが、廃止され、削除されました。だから、このアプローチはうまくいきません。 – struthersneil

答えて

1

問題が#captureは廃止し、削除されたということです。

個人的には、ゲームコンテンツの生成とI/Oを分離することができます。これは、その方法で作業してテストする方が簡単だからです。だからputsの代わりに、あなたのボード(各行の最後に\n)を含む文字列を作成して、正しいことをテストしてください。実際のゲームでは、putsコールでボードをコンソールに出力します。

実際にSTDOUTをキャプチャしたい場合は、方法があります。 $stdoutは、現在のSTDOUTストリームへの参照を含むグローバルです。デフォルトでは、これは常にSTDOUTに設定されています。定数はプログラムの実際のSTDOUTを表しますが、別のIOストリームに$stdoutをリダイレクトできます。たとえば、StringIOオブジェクトです。 putsは、STDOUTに直接書き込むのではなく、$stdoutが指し示すものに書き込みます(そこには微妙な違いがあります)。

$stdout = StringIO.new 
puts 'this is my output' 
captured_output = $stdout.string 
$stdout = STDOUT # restore it when you're done 

今、あなたはcaptured_outputでキャプチャ(改行文字が続く)「これが私の出力である」を持ちます。しかし、その時にSTDOUTに行ったこともあるので、理想的ではありません(例えば、ルビーコンソールのコンソール出力)。あなたはそれが常に復元されていることを保証するメソッドでラップする必要があります。

def capture() 
    $stdout = StringIO.new 
    yield 
    $stdout.string 
ensure 
    $stdout = STDOUT 
end 

これはブロックで使用できます。

capture { puts 'xyz' } 
=> 'xyz\n' 

(しかし、あなたがこのアプローチを忘れて、単なる文字列として、あなたのボードを構築する場合は、簡単に生活をしているでしょう。)

関連する問題