我正在构建一个用于计费个人的设置屏幕。控制器/视图位于Admin命名空间中。
在没有执行第一次测试时:js =>我得到一个失败,我认为这是因为链接不能作为一个帮助器使用js脚本来构建一组嵌套字段(基于Railscasts单一形式,多个表 - 嵌套属性)。
Failures:
1) Patient Setup create patient bill heading - with extended details -with valid data
Failure/Error: fill_in "Extended Bill Heading", :with => 'Regular Registration'
Capybara::ElementNotFound:
cannot fill in, no text field, text area or password field with id, name, or label 'Extended Bill Heading' found
# (eval):2:in `fill_in'
# ./spec/requests/admin/patient_setup_pages_spec.rb:52:in `block (4 levels) in <top (required)>'
Finished in 0.83047 seconds
3 examples, 1 failure, 2 pending
但是当我使用:js = true时,我遇到了一个失败,这个失败似乎是来自登录时运行时屏幕上闪烁的无效用户/密码。
Failures:
1) Patient Setup create patient bill heading - with extended details -with valid data
Failure/Error: click_link 'System'
Capybara::ElementNotFound:
no link with title, id or text 'System' found
# (eval):2:in `click_link'
# ./spec/requests/admin/patient_setup_pages_spec.rb:22:in `block (2 levels) in <top (required)>'
Finished in 6.33 seconds
3 examples, 1 failure, 2 pending
这是支持所有这些的代码。
spec/requests/admin/patient_setup_spec.rb
require 'spec_helper'
feature 'Patient Setup' do
let!(:ci_user) { FactoryGirl.create(:user,
name: "configuration engineer",
password: "password",
password_confirmation: "password"
) }
let!(:admin_role) { FactoryGirl.create(:admin_role) }
let!(:assignment) { FactoryGirl.create(:assignment,
:role => admin_role,
:user => ci_user
) }
before do
visit login_path
fill_in "Name", with: "configuration engineer"
fill_in "Password", with: "password"
click_button "Login"
save_and_open_page
click_link 'System'
click_link 'Patient Setup'
end
describe "create patient bill heading" do
before do
click_link 'New Bill Heading'
fill_in 'Bill heading', :with => 'Consultation'
fill_in 'Abbreviation', :with => "CON"
end
context "- no extended details" do
pending
scenario "- with valid data" do
pending
click_button 'Create Patient bill heading'
page.should have_content('Patient Bill Heading created.')
end
end
context "- with extended details", :js => true do #(without :js => true 1st error)
before do
# save_and_open_page
click_link "Extended Bill Heading"
# save_and_open_page
end
scenario "-with valid data" do
save_and_open_page
fill_in "Extended Bill Heading", :with => 'Regular Registration'
end
end
end
end
这是我的工厂设置。
spec/factories.rb
FactoryGirl.define do
# Users, Roles
factory :user do
name "Joesephine Bloggs"
password "testmenow"
password_confirmation "testmenow"
end
factory :admin, :class => User do
sequence(:name) { |n| "Administrator-#{n}" }
password "adminiam"
password_confirmation "adminiam"
after(:create) do |user|
FactoryGirl.create(:assignment, :role => FactoryGirl.create(:admin_role), :user => user )
end
end
factory :role do
description { "Clerical-#{rand(99)}" }
factory :admin_role do
description "Admin"
end
end
factory :assignment do
user
role
end
# Patients Module
factory :patient_bill_heading do
sequence(:bill_heading) { |n| "bill-heading-#{n}" }
sequence(:abbreviation) { |n| "abbreviation-#{n}" }
factory :delete_patient_bill_heading, :class => PatientBillHeading do
bill_heading :bill_heading
abbreviation :abbreviation
end
end
end
以下是我视图中的链接,用于调用生成嵌套属性字段的帮助程序。
<p>
<%= link_to_add_fields "Extended Bill Heading", f, :patient_extended_bill_headings %>
</p>
这是帮手。
helpers/application_helper.rb
def link_to_add_fields(name, f, association, options={})
defaults = {
:partial_name => nil
}
options = defaults.merge(options)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
if options[:partial_name].nil?
render(association.to_s.singularize + "_fields", f: builder)
else
render(options[:partial_name], f: builder)
end
end
link_to("#{name} <i class='icon-plus icon-white'></i>".html_safe,
'#',
class: "btn btn-success add_fields",
data: {id: id, fields: fields.gsub("\n", "")}
)
end
我正在努力提高我的RSpec测试知识,因为我在一小时后成功地在我的应用程序中构建了这个工作,试图弄清楚为什么我会遇到测试失败。所以在应用程序中它可以工作,但我想了解如何让我的测试通过。
我的断言是一个错误是由于使用js创建链接,并且capybara没有运行它,因为我不使用:js =&gt;真的选择?
使用时可以看到我做错了什么:js =&gt;真的选择?
答案 0 :(得分:24)
您的spec_helper.rb中可能有config.use_transactional_fixtures = true
。它不适用于Capybara javascript规范,因为服务器和浏览器客户端在不同的线程上运行。由于服务器上的数据库事务对客户端不可见,因此客户端不知道您在let!()中创建的用户,因此用户无法登录系统。
您需要在每次运行之前/之后关闭事务性灯具并清理数据库(考虑gem database_cleaner)以获取您的js规范。
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean_with :truncation
end
config.before(:each) do
if example.metadata[:js]
DatabaseCleaner.strategy = :truncation
else
DatabaseCleaner.strategy = :transaction
end
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
以上代码段取自the contact manager app readme并略有修改