【问题标题】:Controller spec .reload error: no implicit conversion of nil into Hash控制器规范 .reload 错误:没有将 nil 隐式转换为 Hash
【发布时间】:2014-07-12 03:44:39
【问题描述】:

当我尝试使用 .reload 测试 Update 方法时,我的 rspec 测试失败。

错误

Admin::CompaniesController PUT update valid attributes changes @company's attributes
 Failure/Error: @company.reload
 TypeError:
   no implicit conversion of nil into Hash
 # ./spec/controllers/admin/admin_companies_controller_spec.rb:81:in `block (4 levels) in <top (required)>'

规范

# spec/controllers/admin_companies_controller_spec.rb
describe 'PUT update' do
  before :each do
    @company = create(:company, name: "Rockstars", phone: "3035551212")
  end

  context "valid attributes" do
    it "changes @company's attributes" do
      put :update, id: @company, company: attributes_for(:company, name: "Fishstars")
      @company.reload       #line 81
      expect( @company.name ).to eq("Fishstars")
    end
  end
end

我也尝试过 (1) 使用 let!(),(同样的错误)

describe 'PUT update' do

  let!(:company)  { create(:company, name: "Rockstars", phone: "303555121d") }

  context "valid attributes" do
    it "changes company's attributes" do
      put :update, id: company, company: attributes_for(:company, name: "Fishstars")
      company.reload       #line 81
      expect( company.name ).to eq("Fishstars")
    end
  end
end

我也尝试过 (2)(同样的错误)

  before :each do
    @company = create(:company, name: "Rockstars", phone: "3035551212")
  end

  it "changes @company's attributes" do
    @attr = { name: "Fishstars" }
    put :update, id: @company.id, :company => @attr
    @company.reload
    expect( @company.name ).to eq("Fishstars")
  end

我的第一个想法是变量@company 为 nil,但如果我注释掉第 81 行(指示),测试会按预期失败。

更新

在第 81 行之前插入“byebug”可以让我看到@company 的样子:

(byebug) @company
#<Company id: 1, name: "Rockstars", hq_address: "MyString", hq_city: "MyString", hq_state: "MyString", country: "MyString", description: "Description 1", phone: "3035551212", email: "Example2email@gmail.com", owner_id: 2, contact_name: "MyString", created_at: "2014-07-11 19:02:24", updated_at: "2014-07-11 19:02:24", active: true, logo_file_name: nil, logo_content_type: nil, logo_file_size: nil, logo_updated_at: nil, slug: "rockstars", refund_policy: "Refund policy">

(byebug) @company.reload
TypeError Exception: no implicit conversion of nil into Hash
nil

【问题讨论】:

标签: ruby-on-rails rspec


【解决方案1】:

我无法弄清楚为什么 .reload 不起作用,但我用 find_by_id 调用替换了它,我的测试现在可以正常工作:

# new code - effectively tests the update method
@company = Company.find_by_id(@company)

# original code - causes errors
@company.reload       #line 81

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多