2012-10-25 12 views
9

Sto costruendo una schermata di configurazione per la fatturazione di individui. Il controller/le viste si trovano nello spazio dei nomi di amministrazione.RSpec-rails-capybara - diversi errori con: js => true e senza

Quando si esegue il primo test senza: js => true Ottengo un errore, che presumo è dovuto al fatto che il collegamento non funziona come un helper che utilizza uno script js per creare un insieme di campi nidificati (Basato su Railscasts Single form, più tabelle - Attributi nidificati).

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 

Ma quando io uso: js = true, sto diventando un fallimento che sembra essere dalla login con Invalid user/password lampeggiante sullo schermo durante l'esecuzione.

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 

Qui è il codice che esegue tutto questo in su.

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 

Ecco la configurazione di fabbrica.

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 

Ecco il collegamento nella mia vista per chiamare l'helper che genera i campi di attributo nidificati.

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

Ed ecco l'aiutante.

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 

Sto cercando di migliorare la mia conoscenza test RSpec, come ho costruito con successo questo lavoro nella mia domanda dopo un'ora cercando di capire il motivo per cui mi è stato sempre fallimenti dei test. Quindi nell'app funziona, ma voglio capire come passare il test.

La mia affermazione è che un errore è dovuto all'utilizzo di js per creare il collegamento e capybara non lo sta eseguendo poiché non utilizzo l'opzione: js => true?

Qualcuno può vedere cosa sto facendo male quando si utilizza l'opzione: js => true?

risposta

23

Probabilmente hai config.use_transactional_fixtures = true nel tuo spec_helper.rb. Non funziona con le specifiche javascript di Capybara perché il server e il client browser funzionano su thread separati. A causa del fatto che le transazioni di database sul server non sono visibili al client, il client non ha idea sull'utente che hai creato in let!(), Quindi l'utente non può accedere al sistema.

È necessario disattivare i dispositivi transazionali e pulire il database prima/dopo ogni esecuzione (considerare la gemma database_cleaner) per le specifiche 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 

Il frammento di codice di cui sopra è presa da the contact manager app readme e leggermente modificata

+0

Grazie Wei, che ha risolto il problema. Ora la mia prossima soluzione è con Cancan 'load_and_authorize_resource'! – user1149642

+0

Penso che tu abbia sbagliato la sintassi, non dovrebbe essere 'config.before (: each) do | example |'? – Noz

+0

No, funziona, io uso quella sintassi in un progetto. Non ho letto troppo nel codice sorgente. Ma la mia ipotesi è che abbia qualcosa a che fare con https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/example_group.rb#L440. Probabilmente anche la tua sintassi funzionerebbe. – Wei

Problemi correlati