Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capybara webkit doesn't pass params from angular

I am trying to port a selenium test suite to capybara-webkit. The Rails app has an angular app embedded in the rails views and is not behaving as expected with webkit.

A test like this:

require 'spec_helper'

feature 'Editing company profiles' do
  before do
    @user = create(:employee)
    @company = Company.find(@user.employer.id)
    sign_in_as! @user
  end

  scenario 'successfully', js: true do
    click_link 'Dashboard'
    click_link @company.name
    click_button 'Edit'
    fill_in 'company_name', with: 'new name'
    click_button 'Save'

    expect(page).to have_content "Your company profile has been updated!"
  end
end

Will pass without issue in selenium, but with webkit I get the error

 Failure/Error: Unable to find matching line from backtrace
 ActionController::ParameterMissing:
   param is missing or the value is empty: company
 # ./app/controllers/api/v1/companies_controller.rb:23:in `company_params'
 # ./app/controllers/api/v1/companies_controller.rb:10:in `update'

The trace is missing, maybe because it's from angular land, but the error is reporting that no params are coming from the client. I've tried the capybara-angular gem, but it has not helped. I've also tried saving the page with capybara and nothing looks out of place there, are there any ways to access the PATCH request inside of webkit that's being generated in this test? I've also gotten similar errors with poltergeist.

Has anyone setup headless rspec testing with angular + rails? Any tips on how to debug why data isn't being sent over from the client?

like image 638
user2936314 Avatar asked Feb 11 '23 05:02

user2936314


1 Answers

Without seeing all of your code, this feels like it could be a problem associated with a known issue in the capybara-webkit gem is unable to pass entity bodies to the server.

I suspect that the update request is being sent as a PATCH request (which is appropriate), but the issue with the gem results in failure for your tests.

A workaround to your problem is to change the method of the request to PUT or POST, the issue linked above shows some options. You will be able to get your test to pass, but it's up to you to decide if changing the request type is worth getting your test to pass.

Note: In practice it may not matter if you don't actually use PATCH, as you could technically use (some of) the other http methods interchangeably -- but use caution as there are reasons to use a specific http method for a given situation. See this rubyonrails.org post from a few years ago for some details.

like image 125
Ecnalyr Avatar answered Feb 13 '23 17:02

Ecnalyr