テストしたい単純な関数があります(おそらく、ほとんどの場合、simplecovをなだめるためです)。機能は次のとおりです。
module Utils
extend self
def blather(msg)
msg = "=== " + msg
STDERR.puts(msg)
Rails.logger.debug(msg)
end
end
スタブのRSpec ドキュメントには、次のように書かれています。
メッセージは、Ruby のコア ライブラリのクラスを含め、任意のクラスでスタブ化できます。
ただし、次のとおりです。
# 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 クラス) をスタブ化することは可能ですか? クラスメソッドだから失敗?それとも、この種のテストのためのより賢明な戦略はありますか?