2012-10-25 5 views
9

Buduję ekran konfiguracji do rozliczania osób. Kontroler/widoki znajdują się w obszarze nazw Admin.RSpec-rails-capybara - różne awarie z: js => true i bez

Po uruchomieniu pierwszego testu bez: js => true otrzymuję jeden błąd, który zakładam, że łącze nie działa jako jego pomocnik, który używa skryptu js do zbudowania zagnieżdżonego zestawu pól (Na podstawie pojedynczego formularza Railscasts, wielu tabel - zagnieżdżonych atrybutów).

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 

Ale kiedy używać: js = true, Dostaję awarię, która wydaje się być z logowania z Nieprawidłowy użytkownik/hasło miga na ekranie podczas pracy.

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 

Oto kod, który tworzy kopię tego wszystkiego.

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 

Oto moje ustawienia fabryczne.

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 

Oto link w moim widoku do wywołania pomocnika, który generuje zagnieżdżone pola atrybutów.

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

A tu jest pomocnik.

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 

staram się poprawić moją rspec testowania wiedzy, jak już udało się stworzyć tej pracy w mojej aplikacji po godzinie próbuje dowiedzieć się, dlaczego byłem coraz niepowodzenia testu. Tak więc w aplikacji działa, ale chcę zrozumieć, jak sprawić, aby mój test minął.

Czy moje twierdzenie, że jeden błąd wynika z użycia js do utworzenia linku, a capybara go nie uruchamia, ponieważ nie używam opcji: js => true?

Czy ktoś może zobaczyć, co robię źle, używając opcji: js => true?

Odpowiedz

23

Prawdopodobnie masz config.use_transactional_fixtures = true w swoim spec_helper.rb. Nie działa ze specyfikacjami Capybara javascript, ponieważ serwer i klient przeglądarki działają w oddzielnych wątkach. Z uwagi na fakt, że transakcje bazy danych na serwerze nie są widoczne dla klienta, klient nie ma pojęcia o użytkowniku utworzonym w let!(), Dlatego użytkownik nie może zalogować się do systemu.

Musisz wyłączyć urządzenia transakcyjne i wyczyścić bazę danych przed/po każdym uruchomieniu (weź pod uwagę klejnot database_cleaner) dla specyfikacji 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 

Kod powyżej fragment pochodzi z the contact manager app readme i nieco zmodyfikowany

+0

Dziękuję Wei, który rozwiązał problem. Teraz moją kolejną do rozwiązania jest opcja "load_and_authorize_resource" w serwisie Cancan! – user1149642

+0

Myślę, że masz błędną składnię, czy nie powinno to być 'config.before (: each) do | example |'? – Noz

+0

Nie, działa - używam tej składni w projekcie. Nie czytałem zbyt wiele w kodzie źródłowym. Ale domyślam się, że ma to coś wspólnego z https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/example_group.rb#L440. Twoja składnia prawdopodobnie też by działała. – Wei

Powiązane problemy