在这里学习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可以测试遍历关联吗? 我猜这与没有包含关系键的灯具有关吗?
任何指导都会很棒。谢谢!
答案 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
,这样就可以了。