0
votes

I want to check if there loads correct page after clicking 'sign in' button.

users_spec.rb

before :each do
  user = User.create(:email => '[email protected]', :password => '123')
end

it "signs me in" do
  visit '/users/sign_in'
  within("#new_user") do
    fill_in 'Email', :with => '[email protected]'
    fill_in 'Password', :with => '123'
    click_button 'Sign in'
  end
  expect(page).to have_content '#{user.name}' 
end

expect(page).to have_content 'Dashboard' checks is there user.name word on the same page, where the form is located. So, what's the sense in click_button then? How to make it check content on the page that should load AFTER click_button? By the way, how to correctly name such tests? Sorry, if it's a silly question, I'm a newbie in rspec :c

Thank you!

1

1 Answers

0
votes

You have to pick some content that appears on the page after the user logs in. Does your app display a message saying something like "You are now logged in", if so you can do

expect(page).to have_content("You are now logged in")

If not, does it display the users name in a header bar? Then you can do something like

expect(page).to have_css("header", text: user.name)

etc... The key is that whatever you're searching for needs to appear on the next page but not on the page with the form. In both of those cases Capybara will wait up to Capybara.default_max_wait_time seconds while retrying to find the text (assuming you're using a driver other than rack-test) which should give the next page time to load. If you're using the rack-test driver then there is no JS or asynchronous support, the click_button should have submitted a form and the expect won't execute until the next page has loaded.

As for test naming -- name it something that makes sense to you so you know what its doing a year from now.