Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”
Posted
技术标签:
【中文标题】Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”【英文标题】:Rspec Testing : NoMethodError - undefined method 'id' for nil.Nilclass 【发布时间】:2018-04-20 05:29:24 【问题描述】:当我在 Rails 中为控制器运行 rspec 测试时,我在第二行收到错误 "NoMethodError : undefined method 'id' for nil.Nilclass"
。
params[:tag_id] 是从前端传下来的,所以我无法初始化它。 我该如何纠正这个错误?
#enables the id to be a name rather than just a number
if (params[:tag_id].class) == String && (params[:tag_id]!= "alltags")
tag_id = Tag.find_by(name: params[:tag_id]).id
elsif params[:tag_id] == "alltags"
tag_id = "alltags"
else
tag_id = params[:tag_id]
end
添加 rspec 测试用例
context "POST search_time_range" do
it 'returns all data within a certain time range and where the tag_id matches' do
params =
"range_start" => "2016-01-01",
"range_end" => "2016-01-01",
"tag_id" => "122"
post :search_time_range, params
expect(response).to have_http_status(200)
end
【问题讨论】:
Tag.find_by(name: params[:tag_id])
没有找到 Tag
记录。你确定不想要Tag.find(params[:tag_id])
?
是的,如果从前端传递的值是字符串,我只想获取 id。
【参考方案1】:
首先你有一个错误:
Tag.find_by(name: params[:tag_id]).id
应该是:
Tag.find_by(id: params[:tag_id]).id
或者:
Tag.find(params[:tag_id]).id
params[:tag_id]
从前端传下来
当您从规范中提出请求时,您需要将 tag_id
传递给参数。请记住,您需要仔细检查,在您的 rspec 中,您还在数据库中创建了一个有效的 Tag
记录,您将在传递的 params
中引用它
更新
context "POST search_time_range" do
it 'returns all data within a certain time range and where the tag_id matches' do
tag = Tag.create(name: '122')
params =
"range_start" => "2016-01-01",
"range_end" => "2016-01-01",
"tag_id" => tag.name
post :search_time_range, params
expect(response).to have_http_status(200)
end
end
作为一种快速有效的解决方案。但最好将测试数据存储在某种固定装置中或使用 factory_girl。
【讨论】:
params[:tag_id] 如果是字符串,则为名称。所以需要在数据库中通过名称等价物找到它。 那你就不应该叫它tag_id。使用一些通用名称。你能提供你的规范文件代码吗? 在问题中添加了 rspec 测试用例。 更新了我的答案以上是关于Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”的主要内容,如果未能解决你的问题,请参考以下文章
RSpec NoMethodError:“主对象的未定义方法‘描述’”
Rails无法加载shoulda-matchers 3.1.1 gem,undefined方法`allow_value'代表#
Rspec: everyday-rspec实操。第7章使用请求测试-测试API