2012-10-25 25 views
9

Tôi đang xây dựng màn hình thiết lập để thanh toán cho các cá nhân. Bộ điều khiển/lượt xem nằm trong vùng tên quản trị.RSpec-rails-capybara - các lỗi khác nhau với: js => true và không có

Khi chạy thử nghiệm đầu tiên mà không có: js => true Tôi nhận được một lỗi, mà tôi giả định là thực tế là liên kết không hoạt động như một trình trợ giúp sử dụng tập lệnh js để tạo nhóm tập hợp lồng nhau (Dựa trên biểu mẫu đơn Railscasts, nhiều bảng - Thuộc tính lồng nhau).

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 

Nhưng khi tôi sử dụng: js = true, tôi nhận được lỗi có vẻ như đăng nhập với người dùng/mật khẩu không hợp lệ nhấp nháy trên màn hình khi chạy.

enter image description here

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 

Dưới đây là đoạn code mà sao tất cả điều này.

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 

Đây là thiết lập nhà máy của tôi.

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 

Đây là liên kết trong quan điểm của tôi để gọi người trợ giúp tạo các trường thuộc tính lồng nhau.

<p> 
    <%= link_to_add_fields "Extended Bill Heading", f, :patient_extended_bill_headings %> 
</p> 

Và đây là trợ giú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 

Tôi đang cố gắng cải thiện kiến ​​thức kiểm tra RSpec của mình, vì tôi đã xây dựng thành công công việc này trong ứng dụng sau một giờ cố gắng tìm ra lý do tại sao tôi bị lỗi kiểm tra. Vì vậy, trong ứng dụng nó hoạt động, nhưng tôi muốn hiểu làm thế nào để vượt qua bài kiểm tra của tôi.

Xác nhận của tôi là một lỗi là do sử dụng js để tạo liên kết và capybara không chạy nó vì tôi không sử dụng tùy chọn: js => true?

Ai có thể xem tôi đang làm gì sai khi sử dụng tùy chọn: js => true?

Trả lời

23

Bạn có thể có config.use_transactional_fixtures = true trong spec_helper.rb của mình. Nó không hoạt động với thông số kỹ thuật javascript Capybara vì máy chủ và trình duyệt của khách hàng chạy trên các luồng riêng biệt. Do thực tế rằng các giao dịch cơ sở dữ liệu trên máy chủ không hiển thị với máy khách, máy khách không có đầu mối về người dùng mà bạn đã tạo trong let!(), Do đó người dùng không thể đăng nhập vào hệ thống.

Bạn cần phải tắt đồ đạc giao dịch và làm sạch cơ sở dữ liệu trước/sau mỗi lần chạy (xem đá quý database_cleaner) để biết thông số kỹ thuật js của bạn.

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 

Đoạn mã trên được lấy từ the contact manager app readme và chút thay đổi

+0

Cảm ơn bạn Wei, mà giải quyết được vấn đề. Bây giờ kế tiếp của tôi để giải quyết là với Cancan 'load_and_authorize_resource'! – user1149642

+0

Tôi nghĩ rằng bạn đã có cú pháp sai, không phải là 'config.before (: mỗi) làm | ví dụ |'? – Noz

+0

Không, nó hoạt động - tôi sử dụng cú pháp đó trong một dự án. Tôi đã không đọc quá nhiều vào mã nguồn. Nhưng tôi đoán là nó có liên quan đến https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/example_group.rb#L440. Cú pháp của bạn có lẽ cũng sẽ hoạt động. – Wei

Các vấn đề liên quan