ruby-on-railsajaxrspeccapybaracapybara-webkit

Rspec Capybara test with ajax call not updating record


I have a form where when a user submits an ajax form with a single name field, a record is created that belongs to a Template object. This all works fine manually, but for some reason when I test this via rspec its telling me that the association was not created. Why isn't the template object updated here?

describe "edit page" do
  before(:each) do
    visit edit_admin_template_path(template)
  end

  context "form sections", js: true do  
    it "allows admin to create one" do
      find("#btn-add-section").click
      within('#new_form_section') do
        fill_in 'Name', with: "Personal Info"
        click_button "Create Section"
      end
      expect(template.form_sections.length).to eq(1)
    end
  end
end

This is the failure that I am getting

Failure/Error: expect(template.form_sections.length).to eq(1)

   expected: 1
        got: 0

   (compared using ==)

UPDATE: just noticed this in the rspec output

An error occurred in an after hook
    ActionView::Template::Error: undefined method `form_sections' for nil:NilClass

so its telling me that the template object does not exist, then its able to compare it afterwards?

UPDATE 2: So it appears that the issue is waiting for the ajax call to complete in capybara, before expecting. I added this to the spec and it now works, obviously I need to refacotr this to something better like a helper

it "allows admin to create one" do
  find("#btn-add-section").click
  within('#new_form_section') do
    fill_in 'Name', with: "Personal Info"
    click_button "Create Section"
  end
  sleep(10) #this waits for the request to complete
  expect(template.form_sections.length).to eq(1)
end

Solution

  • The key is telling RSpec to wait for the ajax call to complete before doing any expectations. This is a great post on the solution that I used:

    Thoughtbot: Automatically Wait for AJAX with Capybara