Capybara :: ElementNotFound:无法找到字段“user_email”

时间:2015-10-06 21:32:52

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

我正在为我的注册页面进行测试,但是我收到此错误,表示无法找到该字段。我在fill_in方法中使用了输入id

<%= form_for @user, url: {action: "create"},html: {class: "horizontal-form", id: "signup-form"} do |f| %>
    <div class="form-group">
            <%= f.email_field :email, placeholder: "Email", class: "form-control" %>
            <%= f.text_field :username, placeholder: "Username", class: "form-control" %>
            <%= f.password_field :password, placeholder: "Password", class: "form-control" %>
            <%= f.password_field :password_confirmation, placeholder: "Password Confirmation", class: "form-control" %>
            <%= f.submit "Sign Up", class: "btn" %>
    </div>
<% end %>

测试

require 'rails_helper'

RSpec.describe UsersController, type: :controller do
    describe "GET Sign-Up" do
        it "returns http success" do
            visit '/signup'
            get :new
            expect(response).to have_http_status(:success)
        end
    end

    describe "Post User" do
        it "creates user" do
            user_params = FactoryGirl.attributes_for(:user)

            fill_in "user_email", with: "user_params[:email]"
            fill_in "user_username", with: user_params[:username]
            fill_in "user_password", with: user_params[:password_digest]
            fill_in "user_password_confirmation", with: user_params[:password_digest]
            click_button "Sign Up"

            expect {
                post :create, user: user_params
            }.to change(User, :count).by(1)
            expect(current_path).to redirect_to(root_path)
        end
    end
end

但我一直收到这个错误

 1) UsersController GET Sign-Up returns http success
 Failure/Error: fill_in "user_email", with: "user_params[:email]"
 Capybara::ElementNotFound:
   Unable to find field "user_email"

2 个答案:

答案 0 :(得分:1)

您在以下几行中所做的事情并不是控制器规范。

 fill_in "user_email", with: "user_params[:email]"
 fill_in "user_username", with: user_params[:username]
 fill_in "user_password", with: user_params[:password_digest]
 fill_in "user_password_confirmation", with: user_params[:password_digest]
 click_button "Sign Up"

这更像是一个功能规范,因为你正在使用模拟浏览器中用户行为的capybara。目前,您正在混合功能和控制器规格,因此当您删除上面的那些行时,您的测试应该可以正常工作。

对于控制器规格,您可以将请求和参数直接发送到您正在测试的控制器,因为它们仅用于测试控制器本身而不是与视图交互。

您可以阅读有关rspec文档中差异的更多信息:

https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs https://www.relishapp.com/rspec/rspec-rails/docs/feature-specs/feature-spec

答案 1 :(得分:1)

我猜你需要在表单变得可见之前单击页面上的链接或按钮,但是如果没有看到更多的页面则无法确认 - 如果不是这样的话那么显示生成的html而不是erb所以我们可以看到它们在浏览器中出现的字段名称。话虽这么说,你的测试不会像你编写它们那样正常工作,因为你混合了功能测试和控制器测试 - 你不能使用capybara方法来填充浏览器中的字段并使用get ,在同一测试中发布等。使用水豚时,您需要执行用户将要执行的操作,然后验证来自这些操作的屏幕更改。