2016-12-12 4 views
1

Bei früheren RSpec-Integrationstests mit: js => false (d. H. JavaScript wurde deaktiviert), liefen meine Tests einwandfrei. Doch für RSpec Tests, bei denen: js => true (und deshalb braucht Capybara WebKit zu verwenden), ich konsequent die folgende Fehlermeldung erhalten:capybaraWebKit kann Webseiten nicht besuchen, wenn RSpec-Tests ausgeführt werden, wenn: js => true

Unable to load URL: http://my.server:5000/auth/identity because of error loading http://my.server:5000/auth/identity: Unknown error

Noted dies auf einer Codezeile geschieht, die gerade arbeitet in Ordnung wenn: js => false (es ist Teil einer Methode, die einen Benutzer anmeldet, der für beide Integrationstests erforderlich ist).

Was ich versucht habe:

  • ufw Verwendung (da ich auf Ubuntu laufen lasse), stellte ich sicher, dass Port 5000 geöffnet ist. Ich glaube jedoch nicht, dass dies das Problem war, da die Tests mit dem gleichen Port in anderen Tests funktionieren konnten, wenn: js => false
  • Besuch anderer Seiten (zB http://my.server:5000/), aber das gleiche Fehlermeldung erscheint.
  • Ich versuchte, den Debug-Code, dass capybara WebKit documentation bietet:

    Capybara::Webkit.configure do |config| config.debug = true

ich es in meinem spec_helper.rb setzen. Aber das gibt mir eine andere Fehlermeldung, nämlich: NoMethodError: undefined method configure' for Capybara::Webkit:Module.

  • Ich habe versucht, Anhalten und Neustarten Frühjahr nach these Anweisungen (spring stop und spring restart verwenden). Immer noch funktioniert nichts. (Ich habe versucht, die Tests nach den beiden Befehle ausgeführt wird, und immer noch die gleiche Fehlermeldung beide Male)

Hinweise zu meiner Konfiguration:

  • Als ich das Projekt erhalten, das spec_helper.rb Datei hatte Capybara.server_port = 5000, und ich habe das nicht geändert. Diese Variable wird dann in allen visit-Methoden verwendet (z. B. "visit" http://my.server:# {Capybara.server_port}/").

  • Es gibt keine Linie, die Capybara.app_host = ______

  • Diese Webanwendung drei Sub-Domains umfasst hat, die ich brauche, um Zugang zu: cms.my.server, www.my.server und admin.my.server. (Beachten Sie, dass my.server ein Stand-in für den tatsächlichen Servernamen ist, den ich aus rechtlichen Gründen nicht verwenden kann). Alle drei davon sind so eingestellt, dass sie in meiner Hosts-Datei zu 127.0.0.1 aufgelöst werden.

Beachten Sie auch, dass mein Teamkollege hat genau den gleichen Test zu arbeiten.

Antwort

2

Angenommen, Sie verwenden die standardmäßige Capybara-rspec-Konfiguration, wenn js: false angegeben ist (oder js Metadaten angegeben sind), dann verwendet Capybara den rack_test-Treiber.Der rack_test-Treiber ignoriert alle angegebenen Hostnamen und Ports vollständig und sendet "Anfragen" direkt an die Routing-Handler der Rails-Apps. Aus diesem Grund, wenn Sie es mit http://my.server:5000 verbinden, es geht einfach direkt an die Routing-Handler mit einem Ziel / - so die Tatsache, dass es funktioniert, wenn js: false angegeben ist in keiner Weise bedeutet, dass Port 5000 tatsächlich etwas tut. Die Frage zu beantworten ist, warum Capybara versucht, eine Verbindung zu Port 5000 herzustellen. Beim Testen einer App mit normaler Capybara-Verwendung startet Capybara die App in einem separaten Thread und bindet sie an 127.0.0.1 an einem zufälligen Port . Es ist höchst unwahrscheinlich, dass der zufällige Port 5000 ist und definitiv nicht mehrere Läufe hintereinander sind. Von hier an sind wir im Erratungsgebiet (ohne Ihre Capybara-Konfiguration zu sehen), aber Sie haben wahrscheinlich Capybara.app_host = 'http://my.server:5000' angegeben, was nur funktionieren würde, wenn Sie es Capybara.server_port = 5000 kombinieren und Capybara zwingen würden, seinen Server an Port 5000 zu binden. Die bevorzugte Option wäre zu tun

Capybara.app_host = 'http://my.server' 
Capybara.always_include_port = true 

die capybara einen zufälligen Port wählen lassen, aber dann fügen Sie es in jedem visit callte (Anmerkung: dies setzt voraus, dass ‚my.server‘ auf der Maschine löst man mit dem Testen 127.0.0.1 sind auf).

+0

Danke. Ich habe meine Frage aktualisiert, um weitere Details zu den Vorgängen zu erhalten. Tut mir leid, dass ich diese Details nicht früher gemacht habe. Meine anfänglichen Versuche, Ihre Lösung zu implementieren, sind noch nicht vorbei, aber ich werde es weiter versuchen. Unter Berücksichtigung der Tatsache, dass ich 3 Subdomains habe, was sollte ich anstelle von "http: // my.server" für "Capybara.app_host" verwenden? – RyanQuey

+2

@foxeshavedens Einstellung Capybara.app_host verhindert nur, dass Sie den vollständigen Servernamen für jede Besuchsanweisung angeben müssen - also, wenn "Capybara.app_host =" http: // admin.my.server "und" Capybara.always_include_port = true 'then' visit '/ go_here'' würde tatsächlich' http: //admin.my.server: /go_here 'besuchen. –

+1

@foxeshavedens Und dann würden Sie wahrscheinlich ein paar Hilfsmethoden hinzufügen wollen, um es einfacher zu machen, zwischen Subdomains usw. zu wechseln. Es gibt einen guten Artikel über das Testen in Capybara mit Subdomains - https://robots.thoughtbot.com/acceptance- tests-with-subdomains –

Verwandte Themen