Rails测试:为什么Association引用会出错

时间:2014-12-02 15:05:46

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

在这里学习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 - &gt; &LT; -belongs_to

公司 - &gt; &lt; - 运行 - &gt; &lt; - Rundatum

在我看来,我的代码中的这些陈述都是罪魁祸首。

@company = rundatum.run.company

r.company.name 

r.company.name

material.rundatum.id

@material.rundatum.id 

rails可以测试遍历关联吗? 我猜这与没有包含关系键的灯具有关吗?

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

1 个答案:

答案 0 :(得分:0)

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

您可以使用r.company.name解决更改r.company.try(:name)的问题。此外,您可以删除此记录并阻止保存无公司运行。

此外,您可以使用n + 1代替Run.includes(:company).collect来阻止Run.all.collect问题,您可以找到更多信息here

如何使用灯具上的关联:see point 2.3.2

在runs.yml上使用company_id:更改company: company_1,这样就可以了。