简体   繁体   中英

Uncheck check_box only not working with rspec / capybara tests

I have a nested form that has 4 checkboxes. Currently, everything is working in browser, but I can't get the capybara tests to uncheck the checkbox and save.

Using Rails 4.2.2 and latest versions of capaybara-webkit and rspec

settings.html.erb

  <%= f.fields_for :preferences do |f| %>
    <div class="email-notifications-holder">
      <div class="email-holder">
        <%= f.label :new_match, "Getting a new match each week" %>
        <%= f.check_box :new_match, class: "checkbox new_match_email" %>
      </div>
      <div class="email-holder">
        <%= f.label :match_reminder, "New matches Thursday reminder", class: "match_reminder_email" %>
        <%= f.check_box :match_reminder, default: true, class: "checkbox"   %>
      </div>
      <div class="email-holder">
        <%= f.label :accepted_match, "A Glassbreakers accepted a match", class: "accepted_match_email" %>
        <%= f.check_box :accepted_match, default: true, class: "checkbox"   %>
      </div>
      <div class="email-holder">
        <%= f.label :new_message, "Received a new message", class: "new_message_email" %>
        <%= f.check_box :new_message, default: true, class: "checkbox"  %>
      </div>
    </div>
  <% end %>

edit_account_spec.rb

  it "allows the user to opt out of new match email", :js do
    user = create(:user)
    preferences = create(:preference, user: user)
    sign_in(user)

    visit edit_user_path(user)
    click_tab(t("edit_user.tabs.settings"))

    find(:css, "#user_preferences_attributes_0_new_match").set(false)

    within "#button-container" do
      page.find('.save.main-save-button-edit').trigger('click')
    end



    visit edit_user_path(user)
    click_tab(t("edit_user.tabs.settings"))

    user.preferences.reload
    new_match_email_checkbox = find(".new_match_email")
    expect(new_match_email_checkbox.checked?).to be_falsey
  end

I've tried clicking it, unchecking it, checking it, trigger clicking it, wrapping it around a within block, reloading the db, etc.

    new_match_email_checkbox = find(".new_match_email")
      within(".email-notifications-holder") do
      page.uncheck('Getting a new match each week')
    end

    new_match_email_checkbox.set(false)

Right now when you save a user's profile, you must have onboard skills saved or else it will throw an error message when you're trying to click the save button.

part of the user controller

  def update
    if update_current_user?(user_params)
      redirect_to user_path(current_user)
    else
      flash["notice"] =
        "Please choose 3 industries, fields and years of experience."
      redirect_to edit_user_path(current_user)
    end
  end

  private

  def update_current_user?(update_params)
    skills_chosen?(update_params[:user_onboard_skills_attributes]) &&
      current_user.update(update_params)
  end

Using save_and_open_page, the error alert wasn't appearing so it was unclear what was happening. I was able to debug this by trailing the logs while running the tests using:

tail -f log/test.log

Just using this will uncheck the checkbox

   within(".email-notifications-holder") do
      page.uncheck('Getting a new match each week')
   end

But you then have to grab the element to test it.

new_match_email_checkbox = find(".new_match_email")
expect(new_match_email_checkbox.checked?).to be_falsey

Note: One thing I am unclear about. Are you trying to make this line work?:

find(:css, "#user_preferences_attributes_0_new_match").set(false) 

or are you trying to uncheck the checkbox after you call user.preferences.reload ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM