【问题标题】:Rspec Testing : NoMethodError - undefined method 'id' for nil.NilclassRspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”
【发布时间】: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。

标签: ruby-on-rails ruby-on-rails-3 rspec


【解决方案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 测试用例。
  • 更新了我的答案
猜你喜欢
  • 2014-09-26
  • 2017-12-09
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多