用于登录页面验证的Capybara测试用例

时间:2017-10-25 06:16:22

标签: ruby-on-rails ruby-on-rails-3 rspec capybara

我下面有水豚测试用例。

it "Testing login page with valid data" do
  fill_in 'email', with: 'kiran@gmail.com'
  expect(page).to have_selector("input[value='kiran@gmail.com']")#Checking values are inserted in email field

  fill_in 'password', with: 'Kiran.6565'
  expect(page).to have_selector("input[value='Kiran.6565']")#Checking values are inserted in password field

  click_button('submit')

  expect(current_path).to eql(patient_detail_path(4))

end

我正在检查登录页面,一旦电子邮件和密码字段匹配,它应该重定向到具有id字段值的patient_details_path。在上面的代码我指定的电子邮件和密码工作正常手动登录,但问题是在测试用例。预期结果:它应该重定向到另一个页面(patient_details_path),但它会再次重定向到主页(/)。

Failures:

1) Login Page Interface Test login page with valid data
   Failure/Error: expect(current_path).to eql(patient_detail_path(4))

   expected: "/patient_details/4"
        got: "/"

   (compared using eql?)
 # ./spec/views/login_spec.rb:41:in `block (2 levels) in <top (required)>'

Finished in 1.08 seconds (files took 2.13 seconds to load)
14 examples, 1 failure

我尝试了stackoverflow的不同解决方案,但对我来说没什么用。以下是尝试过的不同解决方案。

#expect(current_path).to eql(patient_detail_path(4))
#expect(page).to have_current_path(patient_detail_path(4))

如果电子邮件和密码不匹配,则会引发错误并再次重定向到登录页面。在我的场景中,即使电子邮件和密码有效,也会抛出错误。如果我在我的测试用例中添加以下代码,它将通过测试用例。

#expect(page).to have_content "Invalid username/password combination"

任何人请帮助我,我是铁杆和水豚的红宝石。

2 个答案:

答案 0 :(得分:1)

我猜测你尝试写的测试应该写成像

before :each do
  @user = # Create the required user with whatever method you're using
  @patient = # Create the required patient with whatever method you're using
end

it "Logs in with valid data" do
  visit(patient_detail_path(@patient)) # gets redirected to the login path
  fill_in 'email', with: 'kiran@gmail.com'
  fill_in 'password', with: 'Kiran.6565'
  click_button('submit')

  expect(page).to have_current_path(patient_detail_path(@patient))
end

这是一般的猜测,并且可能不是100%正确(很难准确地猜测你正在试图做的一半测试缺失 - 前一块 - 来自你的问题)但是一般部分应该在那里。由于您没有登录,我猜测您实际上并未使用给定的电子邮件和密码创建有效用户,或者您没有创建ID为4的患者(你真的不应该依赖于在功能测试中测试特定的id号。

此外,在检查给定的路径/网址时,您应始终使用have_current_path匹配器,因为它会阻止测试剥落,因为它不是视图测试,所以它不应该在{ {1}},更合适的是spec/views/login_spec.rb

答案 1 :(得分:0)

在我看来,在Rails有机会更新URL以反映新页面之前,驱动程序正在捕获URL。

执行导航更改后,在URL上断言很难,因为可能会出现竞争条件。我建议:

断言可以验证用户是否已成功登录的其他信息。 使用等待选项断言。

expect(page).to have_current_path(patient_detail_path(@patient), wait: 3)