我正在为我的注册页面进行测试,但是我收到此错误,表示无法找到该字段。我在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"
答案 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 ,在同一测试中发布等。使用水豚时,您需要执行用户将要执行的操作,然后验证来自这些操作的屏幕更改。