如何在控制器规范中测试strong_parameters?

时间:2013-03-20 10:25:36

标签: ruby-on-rails ruby rspec ruby-on-rails-4 strong-parameters

我想在添加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

1 个答案:

答案 0 :(得分:3)

我在这里看到了一些事情。

第13行上显示undefined method的事实是因为未分配@event变量,因此assigns(:event)返回nil。 您应该查看为什么会发生这种情况,也许您有一些身份验证阻止您更新记录?也许你可以查看测试日志,看看实际发生了什么 可能是因为你正在使用let()这是懒惰的,当你试图搜索它时,记录实际上还没有,但我不完全确定。您可以尝试使用let!(),看看是否有帮助。

关于强参数的实际使用情况,如果您只想分配标题,则需要执行以下操作:

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

如果您使用permit!,则事件参数哈希和每个子哈希都会列入白名单。