2016-04-25 10 views
0

Ich stieß auf ein Problem mit Capybara-Webkit. Ein einfaches Beispiel-Code wie diese, die die Anmeldeseite zeigen sollte fehlschlägt:Capybara-webkit unerwartetes Verhalten mit URL-Routen, leere Seite zurück

feature 'user signs in' do 
    scenario 'sign in successfully', js: true do 
    user = create(:user) 

    visit new_user_session_url 
    expect(page).to have_text 'Sign in' 
    end 
end 

Es gibt eine Fehlermeldung:

Failure/Error: expect(page).to have_text 'Sign in' 
    expected to find text "Sign in" in "" 

save_and_open_page zeigt eine leere Seite mit leeren <body></body>. Alles funktioniert gut, wenn js: true entfernt wird.

Ich weiß, dass diese Spezifikation nicht js gesetzt werden muss. Aber die Spezifikationen, die von javascript abhängen, schlagen auch fehl. Das ist also nur eine Beispielspezifikation.

Jeder mit einer Erklärung, warum Capybara-webkit so verhält? Ist es normal, ein Problem oder etwas, das ich nicht richtig eingestellt habe?

[Hinweis] Die App verwendet Subdomänen. Könnte es sein, dass Capybara-webkit nicht gut mit Subdomains funktioniert?

+0

Was genau ist new_user_session_url zurück? –

+0

'http: // www.example.com/users/sign_in' –

Antwort

0

Haben Sie config.action_controller.default_url_options in Ihrer Testumgebung eingerichtet (normalerweise test.rb). Der dort angegebene Host wird von den URL-Helfern zum Erstellen der URL verwendet und muss ein Hostname sein, der zur Schnittstelle capybara führt. Die Testanwendung wird ausgeführt (normalerweise 127.0.0.1). Sie können dies überprüfen, indem Sie new_user_session_url sehen gibt Ihren Testcode zurück.

+0

' config.action_controller.default_url_options' ist nicht gesetzt. Und der Wert von 'new_user_session_url' ist gültig. Es verwendet 'example.com' als Hostname. Ich werde die Frage aktualisieren, um zu zeigen, dass die App stark von Subdomains abhängt. –

+0

Sie sagen, es funktioniert ordnungsgemäß mit new_user_session_path, aber scheitert mit new_user_session_url, der einzige Unterschied ist, dass xxx_url Hostname und (möglicherweise Port-Nummer) in der URL enthält - Haben Sie aktiviert Capybara.always_include_port = true, um sicherzustellen, dass die Portnummer für die Test-App ist für die URL angepasst, die Sie besuchen möchten? –

+0

Überraschenderweise schlägt der xxx_path jetzt auch fehl. Und ja, ich habe 'Capybara.always_include_port' auf' true' gesetzt. Jetzt verstehe ich nicht, wo zu debuggen dies zu suchen :( –

0

Das Problem kam von meinem eigenen Fehler. In meinem Controller suche ich nach der Subdomain, die mit request.url unter Verwendung request.subdomains kommt. Dies gibt ein Array von Subdomänen zurück, die vor dem host in dem url vorliegen.

In meinem Test stub ich ActionDispatch::Request, um :subdomains Methode zu akzeptieren und mit der bereitgestellten Subdomäne zu antworten. Dann kann es mit der Verifikation in der Steuerung fortfahren.

Da gibt es Orte, an denen ich das subdomain Attribut in einer Route url on the fly gesetzt, ich war für request.subdomain unterschiedliche Werte aufweisen (die neue Reihe in der URL) und request.subdomains (die alten vor dem in der Einstellung url). Also entschied ich mich, mit dem Neuen zu gehen und es einfach mit .split('.') zu teilen, denn das ist es, womit ich arbeiten muss.

Nachdem ich das geändert habe, habe ich vergessen, den Stub in der Spezifikation zu aktualisieren, um die Anforderungsmethode auf subdomain zu ändern.

Nach dem Ändern funktioniert alles einwandfrei.

Ich hoffe, dass dies hilft jedem mit dem gleichen Problem konfrontiert. Zumindest wird es sie daran erinnern, alle Stubs, die sie haben, zu aktualisieren.

[Update] Offenbar ist der Grund, warum ich unterschiedliche Werte für die 2-Subdomäne Methode immer war wegen der Stummel in der spec.