I’m using RSPEC and Capybara for testing and getting the following error.
Failure/Error: click_button "Upload"
ActionView::Template::Error:
undefined method `name' for nil:NilClass
# ./app/views/mappings/show.html.erb:164:in `block (2 levels) in _app_views_mappings_show_html_erb__2876658303246235457_70231209394300'
# ./app/views/mappings/show.html.erb:163:in `block in _app_views_mappings_show_html_erb__2876658303246235457_70231209394300'
# ./app/views/mappings/show.html.erb:95:in `_app_views_mappings_show_html_erb__2876658303246235457_70231209394300'
# (eval):2:in `click_button'
# ./spec/requests/upload_maps_spec.rb:29:in `block (2 levels) in <top (required)>'
This is the template file
<%= bootstrap_form_for( [@mapping,@mapping_version], :html => { :multipart => true, :class => "form-horizontal" } ) do |f| %>
<% if @mapping_version.new_record? %>
<%= f.file_field :mapping_file, :class => 'span6' %>
<% else %>
<%= %>
<%= f.file_field :mapping_file, :class => 'span6', :help_block => "Your current mapping file is #{@mapping_version.mapping_file_file_name}. You can choose another file to replace it or just leave blank to keep your original file." %>
<% end %>
<%= f.text_field :version, :class => 'span6', :help_block => "Please use a version number formatted as x.y.z where x, y and z are integers" %>
<%= f.text_area :notes, :class => 'span6', :rows => 5 %>
<%= f.actions do %>
<%= f.submit submit_label %>
<% end %>
<% end %>
Although the label “Upload” isn’t there in the template file it shows up in the HTML.
And this is the test that is giving me an issue.
it "allows user to upload new map" do
user = FactoryGirl.create(:user)
login_as(user, :scope => :user)
@mapping = FactoryGirl.create(:mapping)
login_as(user)
visit new_mapping_url(:host => with_maps_subdomain)
fill_in "Title", :with => "What The Map"
fill_in "Description", :with => @mapping.description
select('Traktor Control S4', :from => 'mapping_midi_controller_id')
select('Traktor Pro 2', :from => 'mapping_software_id')
fill_in "YouTube Video URL", :with => @mapping.video_url
click_button "Next step: upload the mapping file"
current_path.should eq("/mappings/2/mapping_versions/new")
attach_file('Mapping file', './spec/support/DJTT_VCI400SE_v1_1_2_TSI.zip')
fill_in "Version", :with => "0.1.0"
fill_in "Notes", :with => "Initial release"
click_button "Upload"
current_path.should eq ("/mappings/2")
end
Any insight into what might be happening?
i’m not sure but at a first glance i would check the template which is rendered after you have clicked “upload”, i guess that there is the call to the name-method for the nil object, so there is something not properly handed over to the template by the controller
and i want to recomment to write these test as features for providing a clearer test interface see