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:“主对象的未定义方法‘描述’”

为啥 Rspec 找不到 select2 方法?

Rails无法加载shoulda-matchers 3.1.1 gem,undefined方法`allow_value'代表#

Rspec: everyday-rspec实操。第7章使用请求测试-测试API

ruby [rspec]“使用RSpec测试Rails程序”笔记

是否有RSpec等效的RSpec来做TDD?