【问题标题】:Rails Testing: Why do Association References Make ErrorsRails 测试:为什么关联引用会出错
【发布时间】:2014-12-03 05:39:46
【问题描述】:

在这里学习 Rails 测试

我在 Rails 默认测试中遇到错误。

这是与此控制器相关的 3 个错误之一。所有错误http://pastie.org/9756790

RundataControllerTest#test_should_get_edit:
ActionView::Template::Error: undefined method `name' for nil:NilClass
    app/views/rundata/_form.html.erb:15:in `block (2 levels) in _app_views_rundata__form_html_erb___4420969876653961991_47893480'
    app/views/rundata/_form.html.erb:15:in `block in _app_views_rundata__form_html_erb___4420969876653961991_47893480'
    app/views/rundata/_form.html.erb:1:in `_app_views_rundata__form_html_erb___4420969876653961991_47893480'
    app/views/rundata/edit.html.erb:3:in `_app_views_rundata_edit_html_erb__2870890776683796725_47932520'
    test/controllers/rundata_controller_test.rb:33:in `block in <class:RundataControllerTest>'

这是在我的测试中创建 5 个错误之一的行。查看下面的所有罪魁祸首

<%= f.select(:run_id, Run.all.collect {|r| ['Run:' + r.id.to_s + ' for ' + r.company.name + ' to start on ' + r.start_date.strftime("%b %d, %Y"), r.id]}, :selected => params[:run]) -%>

这是我的 Companies.yml 装置

<% 500.times do |c| %>
company_<%= c %>:
  name: <%= "company #{c} name" %>
  street: <%= Random.new.rand(1000..9999).to_s + ' ' + (0...10).map { ('a'..'z').to_a[rand(26)] }.join  + ' street' %>
  city: <%= (0...20).map { ('a'..'z').to_a[rand(26)] }.join %>
  state: <%= "MN" %>
  zip: <%= Random.new.rand(10000..99999) %>
<% end %>

这是我的 runs.yml 装置

one:
  start_date: 2014-09-25
  end_date: 2014-09-25
  company_id:
  building: 1
  paid: false
  stage: MyString
  material_total_lbs: 1
  employees_needed: 1
  is_test: false
  requirements: MyText

two:
  start_date: 2014-09-25
  end_date: 2014-09-25
  company_id:
  building: 1
  paid: false
  stage: MyString
  material_total_lbs: 1
  employees_needed: 1
  is_test: false
  requirements: MyText

这是我的 rundata.yml 装置

one:
  run_id:
  date: 2014-09-23
  building: 1
  machine: MyString
  material_weight: 1.5
  time_mins: 1.5
  rate_lb_hr: 1
  mill_amps: 1
  class_amps: 1
  mill_liner: MyString
  beater_plate_size: MyString
  mill_rpm: 1
  class_rpm: 1
  feeder_type: MyString
  feeder_setting: 1.5
  feeder_aug_diameter: 1.5
  tlgs_set: 1.5
  air_pressure: 1
  temp_mill_out: 1
  temp_prod_out: 1
  temp_ambient: 1

two:
  run_id:
  date: 2014-09-23
  building: 1
  machine: MyString
  material_weight: 1.5
  time_mins: 1.5
  rate_lb_hr: 1
  mill_amps: 1
  class_amps: 1
  mill_liner: MyString
  beater_plate_size: MyString
  mill_rpm: 1
  class_rpm: 1
  feeder_type: MyString
  feeder_setting: 1.5
  feeder_aug_diameter: 1.5
  tlgs_set: 1.5
  air_pressure: 1
  temp_mill_out: 1
  temp_prod_out: 1
  temp_ambient: 1

关系都是has_many ->

公司 ->

在我看来,我的代码中的这些语句是罪魁祸首。

@company = rundatum.run.company

r.company.name 

r.company.name

material.rundatum.id

@material.rundatum.id 

rails 可以测试遍历关联吗? 我猜这与不包含关系键的固定装置有关?

任何指导都会很棒。谢谢!

【问题讨论】:

    标签: ruby-on-rails testing ruby-on-rails-4


    【解决方案1】:

    您的数据库中至少有一个Run 对象,但没有company。然后你会得到udefined method 'name' for nil:NilClass

    您可以解决将r.company.name 更改为r.company.try(:name) 的问题。您还可以删除此记录并防止保存 Run without Company。

    另外,你可以防止n + 1问题,用Run.includes(:company).collect代替Run.all.collect,你可以找到更多信息here

    如何使用固定装置上的关联:see point 2.3.2

    在 runs.yml 上将 company_id: 更改为 company: company_1,它会成功。

    【讨论】:

    • 在我的运行中,夹具 company_id: 对于两个夹具都是空白的。据我了解,rails 在空白时处理此关联。我的公司装置也没有 id: 我相信自动生成的条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多