Rspec 不处理获取请求的参数
Rspec not processing param on get request
我正在将遗留项目升级到 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
有什么想法吗?
由于 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)
)或者您应该使用, .fetch
or .try
以避免 NoMethodError。
缺少参数不应导致 500 内部服务器错误。
我正在将遗留项目升级到 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
有什么想法吗?
由于 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)
)或者您应该使用.fetch
or .try
以避免 NoMethodError。
缺少参数不应导致 500 内部服务器错误。