Rails2.3の話ですが
RSpecでviewからhelper呼ぶときってどうすんだろうと調べてみたら
RSpec.info: Viewsに書いてました。
mock/stub 使いたければtemplateオブジェクトに対して行ってね。
If you wish to mock or stub helper methods, this must be done on the template object:
例も載ってます。
template.should_receive(:current_user).and_return(mock("user"))
そうかそうかと、テストは書けたんだけど
他の人の記事やら見てみると、書き方が分かれていて
template.should_receive はモックで、template.stub! はスタブ
あれ?template.stub は何?
と、混乱してきたのでソースを追ってみた。
まずは、rspec-rails
#rspec-rails-1.3.2/lib/spec/rails/example/render_observer.rb def should_receive(sym, opts={}, &block) __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym.to_sym, opts, &block) end def should_not_receive(sym, &block) __mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block) end def stub(*args) if args[0] == :render register_verify_after_each render_proxy.stub(args.first, :expected_from => caller(1)[0]) else super end end # FIXME - for some reason, neither alias nor alias_method are working # as expected in the else branch, so this is a duplicate of stub() # above. Could delegate, but then we'd run into craziness handling # :expected_from. This will have to do for the moment. def stub!(*args) if args[0] == :render register_verify_after_each render_proxy.stub!(args.first, :expected_from => caller(1)[0]) else super end end
stubとstub!ですが、render_proxyのメソッドが異なります。
そのrender_proxyはコレ。
#rspec-rails-1.3.2/lib/spec/rails/example/render_observer.rb def render_proxy #:nodoc: @render_proxy ||= Spec::Mocks::Mock.new("render_proxy") end
rspecへ
Spec::Mocks::Mockを見ると、include Methods しているので
Methods.rbを見てみると、stub! がいました(should_receiveもいる)。
#rspec-1.3.0/lib/spec/mocks/methods.rb def stub!(sym_or_hash, opts={}, &block) if Hash === sym_or_hash sym_or_hash.each {|method, value| stub!(method).and_return value } else __mock_proxy.add_stub(caller(1)[0], sym_or_hash.to_sym, opts, &block) end end alias_method :stub, :stub!
なんと alias_method だったんですね。
要は
stubとstub!は一緒。
ただ、rspec-railsのstub!に対するFIXMEコメントはどういう修正を促すのかよく分かってません。
どういうこと?
# FIXME - for some reason, neither alias nor alias_method are working
# as expected in the else branch, so this is a duplicate of stub()
# above. Could delegate, but then we'd run into craziness handling
# :expected_from. This will have to do for the moment.