質問

私は、コントローラのcreateアクションをテストしようとしています。私は認証のために工夫するを使用しています、そして限度にログインにcreateアクションへのアクセスをbefore_filterメソッドを使用していましたユーザーインチここに私のコントローラの関連する部分である。

class RawDataSetsController < ApplicationController
  before_filter :authenticate_user!, :except => [:show, :index, :download]

  def create
    @raw_data_set = current_user.raw_data_sets.build(params[:raw_data_set])
    if @raw_data_set.save
      redirect_to @raw_data_set
    else
      render "new"
    end
  end
end

私のテストケースでは、私は確信してログインしているユーザーRawDataSetを作成できることを確認します。私はこののブログ記事上の指示に従って、認証済みのユーザーを嘲笑していると思いますます。

require 'spec_helper'
describe RawDataSetsController do

  include Devise::TestHelpers

  def mock_users(stubs={})
    @user ||= mock_model(User, stubs).as_null_object
  end

  def log_in_test_user
    attr = { :username => "Foobar", :email => "doineedit@foobar.com" }
    #mock up an authentication in warden as per http://www.michaelharrison.ws/weblog/?p=349
    request.env['warden'] = mock(Warden, :authenticate => mock_users(attr),
                                         :authenticate! => mock_users(attr),
                                         :authenticate? => mock_users(attr))
  end

  before do
    @rds = Factory(:raw_data_set)
  end

  describe "POST 'create'" do

    before do
      @attr = { 
        :organism_name => "Beef Jerky",
        :mass_spec_type => "My Stomach",
      }
    end

    describe "logged in user" do
      it "should create a raw_data_set when the user is logged in" do
        log_in_test_user
        lambda do
          post :create, :raw_data_set => @attr
        end.should change(RawDataSet, :count).by(1)
      end
    end
  end
end

このテストケースを実行すると、次のエラーが発生します

1) RawDataSetsController POST 'create' logged in user should create a raw_data_set when the user is logged in
 Failure/Error: post :create, :raw_data_set => @attr
 undefined method `user_url' for #<RawDataSetsController:0x0000010175af88>
 # ./app/controllers/raw_data_sets_controller.rb:7:in `create'

は、私は、このエラーに困惑しています。以上の検査の際に、@raw_data_setはRawDataSetモデルクラスのインスタンスが、ユーザーではないのですか?これは、ときに私p @raw_data_set

のように見えるものです
#<User:0x807a06a4 @name="User_1002">

悪魔が何が起こっていますか?何が私が間違っているのでしょうか?どのように私は、認証されたユーザとの私のコントローラのアクションを作成テストすることができますか?

役に立ちましたか?

解決

編集 の(完全に間違って最初の試みは削除)

as_null_objectを呼び出すと、基本的にスタブされていないすべてのメッセージを受け入れて、ただの自己を返すためにモックを伝えます。だから、あなたが呼び出すとき、

current_user.raw_data_sets.build(params[:raw_data_set])

通常、代わりにあなたが再びRawDataSetを取得し、current_userに関連する新しいcurrent_userを返します。

あなたは@raw_data_setに渡し、リダイレクトを呼び出すしようとするので、あなたはそれを代わりにRawDataSetインスタンスのモックを渡している、これuser_urlへの誤った呼び出します。

私はこれを処理する方法は、本物のユーザー(または工場)を使用し、その上に工夫メソッドをスタブアウトだと思います。だからあなたのmock_usersは、(例えば)になります:

  def mock_users(stubs={})
    @user = User.create(stubs)
  end

current_userが実際にビルドを行うと、協会を通じて保存されます。

純粋主義者は、あなたの顔にいる青まですべてを模擬し、スタブアウトすることを教えてくれます。あなたが行うには良いものを持っている - ことをねじ。 :)

このアプローチする他の方法は、ビルドメッセージが成功し、セーブするかどうかを確認せずに受信されていることをテストしています。おそらく、あなたのモデルのテストは、関連作品を通して保存するかどうかを確認します - ?なぜ再度テストコントローラ内の

他のヒント

あなたは、例えば、変更のためのサインインの動作を、何かの特定を行うために必要がある場合は、

、あなたは工夫コントローラから継承し、それらを上書きすることができます。 あなたは https://github.com/plataformatec/devise を設定するコントローラ、ここからの指示に従うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top