2017-01-10 3 views
0

Ich habe seltsames Testverhalten, wobei der eingeloggte Zustand inkonsistent gehandhabt wird.Warum schlagen diese Tests fehl, wenn sie gleichzeitig ausgeführt werden, obwohl jedes einzeln ausgeführt wird?

Die Spezifikation protokolliert einen Benutzer, besucht eine (verschachtelte oder nicht verschachtelte) Indexseite und überprüft, ob der richtige Inhalt angezeigt wird. Datensätze werden asynchron abgerufen, obwohl ich denke, dass dies keine Auswirkungen haben sollte.

Wenn jede Spezifikation einzeln ausgeführt wird, durchlaufen sie alle. Wenn alle Spezifikationen zusammen ausgeführt werden, schlagen sie fehl, da der erwartete Inhalt fehlt. Die Verwendung von save_and_open_page zeigt, dass dies darauf zurückzuführen ist, dass die Anmeldeseite gerendert wird und nicht die erwartete Indexseite.

Warum denkt rspec, dass der Benutzer nicht angemeldet ist, wenn alle Spezifikationen zusammen ausgeführt werden, obwohl jede Spezifikation einzeln übergeben wird?

Die Tests in etwa so aussehen

let(:user) {create :user} 
let(:team) {create :team} 
let(:country) {create :country} 

before :each do 
    login_as(user, scope: :user) 
end 

describe 'unnested' do 
    it 'should have the expected content', :js do 
    visit users_path 
    is_expected.to have_content "some content on the page" 
    end 
end 

describe 'nested by team' do 
    it 'should have the expected content', :js do 
    visit team_users_path(team) 
    is_expected.to have_content "some content on the page" 
    end 
end 

describe 'nested by nationality' do 
    it 'should have the expected content', :js do 
    visit country_users_path(country) 
    is_expected.to have_content "some content on the page" 
    end 
end 

Die Spezifikationen alle Javascript erforderlich (ich weiß nicht, ob das hier wichtig ist).

Authentifizierung erfolgt durch Devise behandelt, und mein rails_helper.rb umfasst

config.append_after(:each) do 
    DatabaseCleaner.clean 
    Warden.test_reset! 
end 

Warum glaubt das rspec der Benutzer nicht in, wenn alle Spezifikationen zusammen laufen unterzeichnet werden, doch jede spec einzeln passiert?

Antwort

0

Es hat lange gedauert, diesem Problem auf den Grund zu gehen. Veröffentlichen Sie diese Nachricht, falls dies für andere hilfreich ist, die auf dasselbe Problem stoßen.

Nach langer Suche fand ich schließlich this small mention dass login_as may not work with Poltergeist when js is enabled on your test scenarios.

ich die vorgeschlagenen fix versucht, mit gemeinsamen DB-Verbindungen zu behandeln. Leider führte dies in den folgenden Fehlern:

PG::DuplicatePstatement at /session/users/signin 
ERROR: prepared statement "a1" already exists 

Ich versuchte, das Transactional Capybara Juwel verwenden, aber dies schien nicht gut mit Poltergeist zu arbeiten.

Schließlich habe ich login_as komplett aufgegeben und stattdessen eine kurze Methode geschrieben, die die Anmeldeseite aufruft, E-Mail und Passwort eingibt und sich auf diese Weise anmeldet.

Diese Lösung scheint zu funktionieren. Es fügt ein wenig Overhead hinzu, also verwende ich es nur für Tests mit JS.

0

Wenn Sie Capybara Juwel verwenden, dann gibt es keine Notwendigkeit zu verwenden: js mit Testfälle

Was ich tat, wenn diese helps-

scenario "visit with user signed in" do 
    user = FactoryGirl.create(:user) 
    login_as(user, :scope => :user) 
    visit "/" 
    expect(current_path).to eq('/') 
    expect(page).to have_title "Some Random Title" 
end 

Der andere Weg Sie Benutzer anmelden können Feature-Spezifikationen verwenden wie-

feature 'User signs in' do 
    before :each do 
    @user = FactoryGirl.create(:user) 
    end 

    scenario "Signing in with correct credentials" do 
    visit "/" 
    fill_in "Email", with: @user.email 
    fill_in "Password", with: @user.password 
    click_button "Log In" 
    expect(current_path).to eq("/login/useremail/verification") 
    expect(page).to have_content "Signed in successfully" 
    end 
end 

Falls Ihre Seiten verweisen ajax dann auf diese https://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara

Verwandte Themen