2009-10-09 3 views
10

Rubyプロジェクトでrspecを使ってテストしていますが、-qオプションを使用してもプログラムから何も出力しないようにしたいと思っています。私は試しました:RSpecで `puts`をチェックする

Kernel.should_not_receive :puts 

コンソールに出力されたときに、テストに失敗したわけではありません。

テキスト出力の不在を確認するにはどうすればよいですか?

答えて

15

putsは$ stdoutを内部的に使用します。それが動作する方法のために、最も簡単にチェックする方法は、単に次のように使用することです。$stdout.should_not_receive(:write)

期待どおりにstdoutに何も書き込まれていないかチェックします。 が明示的に呼び出されたとき(例:Kernel.puts "Some text")、Kernel.puts(上記と同じ)はテストに失敗します。ほとんどの場合、現在のオブジェクトのスコープで呼び出されます。

4

上記の回答が間違っています。それはa:writeメッセージを受け取っていないが、:putsメッセージを受け取っている可能性があるため、「動作します」。

正しい行は次のようになります。

$stdout.should_not_receive(:puts) 

また、あなたはあなたが前STDIOに書き込みをするコードを行を置くことを確認する必要があります。例えば:作品を書きますが、期待:実際の期待、プロジェクト私にとって

+0

からRSpecの作業だ

it "should print a copyright message" do $stdout.should_receive(:puts).with(/copyright/i) app = ApplicationController.new(%w[project_name]) end it "should not print an error message" do $stdout.should_not_receive(:puts).with(/error/i) app = ApplicationController.new(%w[project_name]) end 

プットはしていません。あなたのコードは$ stdout.putsを呼び出しますか? –

+0

ちょうど、私は決してそれは非常に動的ではないので、私は$ stdoutに書き込みたいと思います。代わりに、私はstringioのように$ stdoutを再割り当てするので、 "puts"は私が望むものに行きます。期待していないことを覚えておいてください:あなたは書き込みを期待していません。 putsと同じこと。私は肯定的なテストと否定的なテストを行うことであなたが受けているものを見てテストするでしょう。例えば、私は「私は世俗的な贈り物のための帽子を手に入れてはならない」と言っています。それは私がスカーフを手に入れなかったことを意味するものではありません。 –

関連する問題