我在尝试使用此功能规范时难以隔离问题。
require 'spec_helper'
feature 'Add Employee', type: :feature do
scenario 'with valid information' do
# visit setup_add_employees_path
visit '/setup/add_employees'
# save_and_open_page
fill_in "First Name", with: 'Test'
fill_in 'Last Name', with: 'Employee'
fill_in 'Email', with: 'testemployee@example.com'
# fill_in , with: 'testemployee@example.com'
# expect(page).to find_field('First Name').value
end
end
这是多部分表单的第2步,我已经编写了第一步规范并且工作正常。但是,在此规范中,使用表单字段的fill_in不会。
以下是此规范的相关文件:
# add_employees.html.haml
= render "partials/nav_left_setup"
- model_class = Invitation.new.class
#alert_message
.page-header
%h1 Invite Your Employees
%p.lead Now it's time to add your employees to HuddleHR. We'll send an email to your employees when setup is complete. Don't worry, the email will include instructions on how to setup their account and update their personal information.
%p.lead
If you like, you can import your employee list from an
= succeed "." do
%a#show_import_form{ href: "#" } Excel file
= render "partials/setup_import_employees"
= nested_form_for @account, :html => {:class => "invitation"} do |f|
%br/
= f.fields_for :invitations, @invitations do |invitation_form|
= invitation_form.hidden_field :product_id, :value => "1"
= invitation_form.text_field :first_name, :class => "input-small", :placeholder => "First Name", :required => :true
= invitation_form.text_field :last_name, :class => "input-small", :placeholder => "Last Name", :required => :true
%span= invitation_form.email_field :email, :class => "text_field", :placeholder => "Email Address", :required => :true
= invitation_form.collection_select :team_id, @teams, :id, :name
- if invitation_form.object.new_record?
= hidden_field_tag :invitaion_new_record, "new record"
= link_to "Delete", "javascript:void(0);", :class => "btn btn-danger delete_invitation_row_button", :style => "margin-bottom: 12px"
- else
= link_to "Delete", invitation_form.object, :confirm => "Are you sure?", :method => :delete, :remote => true, :class => "btn btn-danger btn-delete destroy_duplicate_nested_form", :style => "margin-bottom: 12px"
= f.link_to_add raw("<i class=\"icon-plus-sign icon-white\"></i> Add An Employee"), :invitations, class: "btn btn-success"
.form-actions
= link_to "Back", @optional_step.prv_link, class: "btn"
= f.submit "Save & Continue", :class => "btn btn-primary"
= link_to "Skip This Step", @optional_step.next_link, class: "btn" if @optional_step.optional == true
# The accounts_controller's create method
def create # TODO we need to document this...
@account = Account.new(params[:account])
if @account.save
# Send the account setup email to the account creator
UserMailer.account_setup_email(current_user).deliver
current_user.add_role!(User::ROLES[0]) # asigning the role roster_admin
current_user.add_role!(User::ROLES[3]) # asigning the role employee
# Sign the account up for Roster and create some inital records like:
# Register Roster as a product the account has subscribed to.
AccountProduct.create!(:account_id => @account.id, :product_id => Product.where(:name => "Roster").first.id)
# Create the account holder's profile
Profile.create!(:user_id => current_user.id, :first_name => @account.account_owner_first_name_input, :last_name => @account.account_owner_last_name_input)
# Create their first default team so they have a place to keep people
Team.create!(name: "Example Team", description: "This is just a placeholder team. You can rename or delete it.", account_id: @account.id, manager_id: current_user.id)
# Create their first job description so they have a place to keep people
JobDescription.create!(title: "Example Job Description", description: "This is just a placeholder job description. You can rename or delete it.", account_id: @account.id)
# Create a first post for the company so they have something on their homepage...
Post.create!(title: "Welcome to HuddleHR", body: "The simple and easy way to manage employee information in the cloud. You can invite employees, setup your org chart, fill out your profile and more.", account_id: @account.id, author_id: current_user.id, scope_id: "1")
# Create the initial employment record
Employment.create!(:user_id => current_user.id, :team_id => Team.find_by_account_id(@account.id).id, :effective_date => Date.today, :comment => "Initial creation of HuddleHR account owner employment record.")
# Set the User.account_id to the created account.id
current_user.update_attributes!(:account_id => @account.id)
setup_steps = @account.product_setup_steps
current_step = ProductSetupStep.where("link =? AND product_id =?", URI(request.referer).path, 1).first # Getting the current step
if current_step
setup_steps << ProductSetupStep.where("link =? AND product_id =?", URI(request.referer).path, 1).first
setup_steps << ProductSetupStep.where("step_number =? AND product_id =?", 1, 1).first
redirect_to current_step.next_link, :notice => 'Your account was successfully created.' if current_step.next_link.present?
redirect_to account_path(@account), :notice => 'Your account was successfully created.' unless current_step.next_link.present?
else
redirect_to account_path(@account), :notice => 'Your account was successfully created.'
end
else
render :action => "new"
end
end
# the imacros file, which I'm told is similar to selenium
' Add Employee
TAG POS=1 TYPE=A ATTR=TXT:Add<SP>An<SP>Employee
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:edit_account_* ATTR=ID:account_invitations_attributes_*_first_name CONTENT=Test
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:edit_account_* ATTR=ID:account_invitations_attributes_*_last_name CONTENT=Employee{{!VAR1}}
TAG POS=1 TYPE=INPUT:EMAIL FORM=ID:edit_account_* ATTR=ID:account_invitations_attributes_*_email CONTENT=testemployee{{!VAR1}}@huddlehr.com
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:edit_account_* ATTR=NAME:commit
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:edit_account_* ATTR=NAME:commit
TAG POS=1 TYPE=A ATTR=TXT:Send<SP>Invitations<SP>To<SP>These<SP>Employees
TAG POS=1 TYPE=A ATTR=TXT:Finish<SP>Setup
TAG POS=1 TYPE=A ATTR=TXT:Finish
如果我不得不猜测,我会说问题在于我没有背景块来模仿这种形式的第2步所加载的东西。在步骤1中,背景块包含sign_up_with(电子邮件,传递)。因此,如果我正确的背景是fill_in无法找到我的form_field id名称的原因,那么我需要在step2功能规范的背景块中设置什么?
BTW,第1步是一个名为create account的规范,如下所示:
# create_account_spec.rb
require 'spec_helper'
# require 'ruby-debug'
feature 'Create Account', type: :feature do
background do
sign_up_with Faker::Internet.email, '1Password'
end
scenario 'Fill form data' do
# visit '/setup'
visit new_account_path
fill_in 'First Name', with: 'Test'
fill_in 'Last Name', with: 'Owner'
fill_in 'Company Name', with: 'Company'
fill_in :account_addresses_attributes_0_line_one, with: '133 Main St'
fill_in :account_addresses_attributes_0_city, with: 'Columbia'
select 'SC', from: 'State'
fill_in :account_addresses_attributes_0_zip, with: '11111'
fill_in :account_phone_numbers_attributes_0_number, with: '(111) 111-11111'
select '(GMT-05:00) Eastern Time (US & Canada)', from: 'Time zone'
click_button('Save & Continue')
end
end
我已阅读以下相关资源,以便更好地了解Capybara和集成测试:
Undefined method `within' using capybara and rspec
Capybara::ElementNotFound, but it is there
rspec Test Result Capybara::ElementNotFound
答案 0 :(得分:1)
好的,所以我理解的问题是我没有正确设置我的背景来模仿多表单集成规范的第2部分所在的站点中的位置。我通过使用FactoryGirl创建用户解决了这个问题,然后将Capybara的fill_in用于user.email&amp;&amp;如上所示,使用user.password而不是使用faker。
现在看看我的规格:
# spec/features/add_employee_spec.rb
require 'spec_helper'
feature 'Add Employee', type: :feature do
background do
user = create :user
visit user_session_path
fill_in 'Email', with: user.email
fill_in 'Password', with: user.password
click_button 'Sign In'
expect(page).to have_content('Setup An Account')
end
scenario 'clicks Add A New Employee and fills out the form' do
account = create :account
save_and_open_page
visit setup_add_employees_path
fill_in 'first_name', with: 'Test'
fill_in 'Last Name', with: 'Employee'
fill_in 'Email', with: 'testemployee@example.com'
end
end
当使用Faker为注册生成不同的用户名时,我错误地设置了“背景”块,就好像我是第一次注册的用户一样。
如果还有其他任何我忽视的事情,或者有一些关于改进我的集成规范的其他提示,我期待着您的意见。