Hatena::ブログ(Diary)

かせいさんとこ

2009-12-03

privateのクラスメソッドをスタブにすると、そのメソッドをSpec上で呼び出すときに、undefined method になる


原因は不明


本体


class Test
  def self.foo 
    var + 'bbb'
  end
  
  def self.var
    'aaa'
  end
  private_class_method :var
end

テスト


require 'test.rb'

describe Test do
  it 'foo' do
    
    #Test.should_receive(:var).and_return('ccc')
    Test.stub!(:var).and_return('ccc')
    Test.foo.should == 'cccbbb'
  end
  
  it 'var' do
    Test.send(:var).should == 'aaa' 
  end
end

実行結果


spec -c test_spec.rb
.F

1)
NoMethodError in 'Test var'
undefined method `var' for Test:Class
./test_spec.rb:12:in `send'
./test_spec.rb:12:

Finished in 0.430245 seconds

2 examples, 1 failure

対策


とりあえず、public にしたら大丈夫だった

なんでだろ???


追記


Object - Rubyリファレンスマニュアル

http://www.ruby-lang.org/ja/man/html/Object.html#send


ruby 1.9 feature: 呼び出し制限がsend, __send__にも影響するようになり、
レシーバを指定した呼び出しではprivateメソッドを呼び出せなくなりました。 
privateメソッドを呼び出す必要がある場合はinstance_evalを使用してください。

1.9 から private メソッドを呼べなくなるらしいので、それはそれで注意


追記


ソースの内側まで突っ込んだ話


KoshigoeBLOG: RSpec の stub! とプライベートメソッドの話

http://blog.koshigoe.jp/archives/2009/12/rspec_stub.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kasei_san/20091203/p1
リンク元