1

strong_parameters gem を追加した後にコントローラーをテストしたいのですが、どうすればよいですか? 私は試した:

コントローラ

class EventsController < ApplicationController
  def update
    @event = Event.find(params[:id])
    respond_to do |format|
      if @event.update_attributes(event_params)
        format.html { redirect_to(@event, :notice => 'Saved!') }
      else
        format.html { render :action => "new" }
      end
    end
  end

  private
  def event_params
    params.require(:event).permit!
  end
end

仕様

describe EventsController do
  describe "PUT update" do
    describe "with forbidden params" do
      let(:event) { Event.create! title: "old_title", location: "old_location", starts_at: Date.today }

      it "does not update the forbidden params" do
        put :update,
          id: event.to_param,
          event: { 'title' => 'new_title', 'location' => 'NY' }

        assigns(:event).title.should eq('new_title') # explicitly permitted
        assigns(:event).location.should eq("old_location")  # implicitly forbidden

        response.should redirect_to event
      end
    end
  end
end

エラー

1) EventsController PUT update with forbidden params does not update the forbidden params
   Failure/Error: assigns(:event).title.should eq('new_title') # explicitly permitted
   NoMethodError:
     undefined method `title' for nil:NilClass
   # ./spec/controllers/events_controller_spec.rb:13:in
4

1 に答える 1

3

ここでいくつかのことが起こっているのがわかります。

13 行目にあるのはundefined method、@event 変数が割り当てられていないため、assigns(:event)nil が返されているためです。なぜそれが起こっているのかを確認する必要があります。おそらく、レコードの更新を妨げている認証がありますか? おそらく、テスト ログをチェックして、実際に何が起こっているかを確認できます。
これは、あなたがlet()怠惰なを使用していて、レコードを検索しようとしたときに実際にはまだ利用できないためである可能性がありますが、完全にはわかりません. 使用してみてlet!()、それが役立つかどうかを確認できます。

強力なパラメーターの実際の使用に関して、タイトルのみを割り当て可能にしたい場合は、次のようなことを行う必要があります。

params.require(:event).permit(:title)

を使用するpermit!と、イベント パラメータがハッシュされ、すべてのサブハッシュがホワイトリストに登録されます。

于 2013-03-20T10:41:32.763 に答える