2012-04-11 12 views
3

私はテストしたいシンプルな機能を持っています(おそらくほとんどがシンプルコブを和らげるために)。機能は次のとおりです。RSpecでSTDERRをスタブすることはできますか?

メッセージは、Rubyのコアライブラリを含め、任意のクラスにスタブすることができます。

module Utils 
    extend self 

    def blather(msg) 
    msg = "=== " + msg 
    STDERR.puts(msg) 
    Rails.logger.debug(msg) 
    end 

end 

RSpec documentation for stubbingは、と言っています。

しかし、次の

# file: spec/lib/utils_spec.rb 
require 'spec_helper' 
describe Utils do 
    context "blather" do 
    it "should print to STDERR" do 
     STDERR.any_instance.should_receive(:puts).with("=== zoo")  
     Utils.blather("zoo") 
    end 
    end 
end 

...私はエラーこのテストはどんな意味があるかどうかの質問にさておき

undefined method `any_instance' for #<IO:<STDERR>> 

を取得し、それが(STDERRをスタブすることが可能ですIOクラス)?これはクラスメソッドなので失敗ですか?あるいは、このようなテストのためのより合理的な戦略がありますか?

答えて

6

まず、あなたは一般的に$stderrではなくSTDERR使用する必要があります。

module Utils 
    extend self 

    def blather(msg) 
    msg = "=== " + msg 
    $stderr.puts(msg) 
    Rails.logger.debug(msg) 
    end 

end 

あなたはRSpecの中で次の操作を行うことができ、あなたの質問に答えるために:

describe Utils do 
    context "blather" do 
    it "should print to stderr" do 
     $stderr.should_receive(:puts).with("=== zoo") 
     Utils.blather("zoo") 
    end 
    end 
end 

あなただけ$stderr.should_receive経由でメソッドをスタブ。 $stderrは通常のオブジェクトなので、通常のようにメソッドをスタブしたり、期待値を設定することができます。

+0

うん - 。以下の私の「当たり前」の回答を参照してください。 –

+0

PS:STDERR上の$ stderrのを好むに関するヒントをありがとう - (http://stackoverflow.com/questions/4279604/what-is-the-difference-between-stdin-and-stdin-in-rubyはその$を説明しますSTDERRはできませんが、stderrは再割り当てできます)。 –

1

Duh。 STDIOはクラスではない - それはIOのインスタンスであるので、変化:

STDERR.any_instance.should_receive(:puts).with("=== zoo") 

STDERR.should_receive(:puts).with("=== zoo") 

にテストパスを作ります。

1

ではなくputsが特定の引数で一度呼ばれた必要との結果の文字列をテストするために、通常より良いですので、標準エラー出力への書き込みには多くの方法があります。あなたはより多くの制御が必要な場合は

expect { blather("zoo") }.to output(/=== zoo/).to_stderr 

、あなたが$stderrを置き換えることができます(そしておそらく:あなたの関数ではなくSTDERRのconstよりも(changableことが意図されている)$stderrを使用して

限り、あなたはRSpecの者がoutput matcher美しい使用することができますStringIOインスタンスとstub_const "STDERR")、以降その.string ... についての主張を作る(これは、どのような出力マッチングdoes internallyある)

関連する問題