0

SubscriptionsControllerは持っています:

  # DELETE /subscription # {{{
  def destroy
    @subscription = current_user.subscriptions.find params[:id]
    @subscription.cancel!
    redirect_to subscriptions_path, :notice => "Abonnement beendet." 
  end# }}}

current_user.subscriptions.find params[:id]Controller-Specs でモックアウトする正しい方法は何ですか?

現在、前のブロックでこれを試しています。

  double(Subscription)
  controller.current_user.stub!(:subscriptions).and_return(Subscription)
  Subscription.stub!(:find).and_return(subscription)

しかし、私の RSpec-Expectations が機能しないため、これは期待どおりに機能しないようです。

it "updates the status to canceled" do
  sub = Subscription.stub!(:find).and_return(subscription)
  sub.stub!(:cancel!)
  sub.should_receive :cancel!
  delete :destroy, :id => 1
end

should_receive期待が満たされないため、このブロックは常に失敗します。

1) SubscriptionsController DELETE /subscription/:id updates the status to canceled
  Failure/Error: sub.should_receive :cancel!
    (#<Proc:0x007fbdec0a2650@/Users/nilsriedemann/.rvm/gems/ruby-1.9.3-p125-perf@bloomy-days/gems/rspec-mocks-2.6.0/lib/rspec/mocks/message_expectation.rb:63 (lambda)>).cancel!(any args)
     expected: 1 time
     received: 0 times
     # ./spec/controllers/subscriptions_controller_spec.rb:38:in
     # `block (3 levels) in <top (required)>'
     # '

その上、誰かがコメントでスタブや嘲笑に関する完全な記事への素敵なリンクをドロップしてくれたら、私はとてつもなく幸せです. それでも(明らかに)そのコツがわかりません。

4

2 に答える 2

4

should_receive返されるオブジェクトではなく、サブスクリプションに設定していますfind

何かのようなもの

Subscription.stub!(:find).and_return(subscription)
subscription.should_receive :cancel!

あなたが求めているものです。

あなたも興味があるかもしれませんstub_chain

some_user.stub_chain(:subscriptions, :find => some_result)

ように物事を設定します

some_user.subscriptions.find 

戻り値some_result

于 2012-07-19T12:17:48.017 に答える
1

それにはいくつかの方法があります。シンプルなソリューションが必要な場合は、stub_chain を使用して、必要な数のメソッドを渡すことができます。

let(:subscription) { mock(:subscription) }
current_user.stub_chain(:subscriptions, :find) { subscription }

さらに別の方法として、アクティブ レコードを直接使用せず、ユーザー モデルに finder メソッドを含める方法があります。

let(:subscription) { mock(:subscription) }
current_user.stub(:find_subscription) { subscription }

それは本当に意見の問題であり、あなたが最も快適に感じるものに帰着します. 個人的には、オプション 1 を使用します。

于 2012-07-19T12:18:04.367 に答える