RSpecのstubとstub!

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.