我正在将一个旧项目升级到Rails 5.0,现在其中一项测试失败了。 测试如下:
describe "tag searching" do
before (:each) do
@admin = FactoryGirl.create(:admin)
stub_authenticate_client(@admin)
end
it "doesnt break a badly formatted tag search" do
get :search, params: {search: {tags: "a"}}
expect(assigns(:tags)).to_not be_nil
expect(assigns(:reports)).to_not be_nil
end
it "doesnt break with a search with no tag params" do
get :search, params: {search: {}}
expect(assigns(:tags)).to_not be_nil
expect(assigns(:reports)).to_not be_nil
end
end
错误发生在第二个测试中,没有标签参数的搜索。在我的控制器中,我致电params[:search][:tags]
并得到
Failure/Error: if params[:search][:tags].nil?
NoMethodError:
undefined method `[]' for nil:NilClass
似乎搜索参数没有通过,但可以在第一个测试中使用。
控制器:
def search
search_params = params['search']
@reports = Report.includes([Report::TAG_CATEGORIES.keys].flatten)
.paginate(:page => params['page'],
:per_page => 50)
tags = extract_tags_from_params(search_params['tags']) # ERROR HERE
tags.each do |category, search_values|
@reports = @reports.tagged_with(search_values, match: :all, on: category) if !search_values.blank?
end
@reports = @reports.where(#some queries related to search param)
@tags = Report.flattened_tags
render 'index'
end
def search_params
params.permit(search: {})
end
有什么想法吗?
答案 0 :(得分:0)
由于RSpec自动忽略空参数,因此该规范失败了。
在这种情况下,有一个非常简单的解决方法:
it "doesnt break with a search with no tag params" do
get :search, params: {search: { foo: ''}}
expect(assigns(:tags)).to_not be_nil
expect(assigns(:reports)).to_not be_nil
end
但是,您收到NoMethodError的事实应该是告诉您您的控制器操作已损坏,并且如果不存在搜索参数,则应提早保释(使用params.require(:search)
),或者您应该使用{ {3}},safe navigation operator或.fetch
以避免NoMethodError。
缺少参数不会导致500内部服务器错误。