Capybara无法找到具有正确ID的表单字段

时间:2016-12-11 17:00:38

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

我尝试使用capybara来模拟登录以测试我的登录表单,但无法找到电子邮件或密码字段。

我已检查页面来源以确认我使用了正确的ID,并且我也尝试使用字段名称。

这是我目前的测试:

it "returns http success" do
      user = FactoryGirl.create(:user)
      visit sessions_new_path
      fill_in 'email', :with => user.email
      fill_in 'password', :with => user.password
      click_button('submit')
      expect(response).to have_http_status(:success)
    end

我的表格:

= form_for(:session, url: login_path, :html => {class: 'login_form'}) do |f|
    .field
      = f.email_field :email, 'data-msg-required' => t('email_required'), :placeholder => t('.form_email'), id: 'email'
    .field
      = f.password_field :password, 'data-msg-required' => t('password_required'), :placeholder => t('.form_pwd'), id: 'password'
    = f.submit t('.form_sbmt'), class: 'btn-submit'

在查看页面源时,ID列为电子邮件和密码(对于相应的字段),名称遵循格式" session [email]"。我尝试过使用"会话[email]" (和等于密码)fill_in但没有运气。

错误我得到了:

Failure/Error: fill_in 'email', :with => user.email

     Capybara::ElementNotFound:
       Unable to find field "email"

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

Capybara不用于控制器测试。 Capybara用于您的应用程序的端到端测试(功能测试),并不仅限于测试控制器。您的操作的控制器测试应该类似于

it "returns http success" do
  user = FactoryGirl.create(:user)
  post :create, session: { email: user.email, password: user.password}
  expect(response).to have_http_status(:success)
end

这将非常快速,无需渲染视图。

答案 1 :(得分:0)

所以我找到了答案。我没有意识到Rspec在运行控制器测试时没有呈现视图(因为它希望单独测试视图)。为了使控制器测试呈现视图,您只需要在其中一个describe-do块中添加renders_view(但不要在it-do块中添加)。

似乎我的测试现在正在运行。

不是评论中讨论的合适答案。