2013-07-09 8 views
5

So habe ich seit einiger Zeit damit zu kämpfen und ich kann nicht scheinen, unsere was falsch läuft, und konnte nicht viel auf was finden könnte möglicherweise dieses Problem verursachen.Tests mit rspec, capybara und poltergeist geben leere html und leere Screenshots zurück

Ich bin relativ neu in Ruby and Rails, sowie test/verhaltensgesteuerte Entwicklung und versuche, einige Akzeptanz (Browser) -Tests mit PhantomJS durch Poltergeist, mit Rspec und Capybara schreiben. Ich glaube, manche Leute nennen das Integrationstests (sie mögen aus einer gewissen Perspektive sein), aber das ist eine ganz andere Diskussion.

Ich habe eine wirklich einfache Funktion, die ich nicht bekommen kann, was ich will:

require 'feature_helper' 

feature 'Logging in', :js => true do 

    scenario 'with incorrect credentials' do 
    visit '/login' 
    puts page.html 
    save_and_open_page 
    page.driver.render('_screenshot.png', :full => true) 
    page.html.should have_selector("title", :text => "hi") 
    end 

end 

So. Einfach, richtig. Es sollte einfach /login gehen und den HTML-Inhalt bei mir werfen, außerdem möchte ich die Seite mit save_and_open_page sehen, und ich möchte, dass sie einen Screenshot macht. Ich habe eine einfache should have_selector hinzugefügt, um den Test fehlschlagen zu lassen, um mehr Feedback zu bekommen.

Der relative Inhalt meines feature_helper.rb:

require 'spec_helper' 
require 'capybara/rspec' 
require 'capybara/rails' 
require 'capybara/poltergeist' 
include Capybara::DSL 

Capybara.register_driver :poltergeist do |app| 
Capybara::Poltergeist::Driver.new(app, { 
     :debug => true, 
     :inspector => true 
    }) 
end 
Capybara.default_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 

FakeWeb.allow_net_connect = %r[^https?://(127.0.0.1|localhost)] # allow phantomjs/poltergeist requests 

DatabaseCleaner.strategy = :truncation 

RSpec.configure do |config| 
    config.before :each do 
     # Set the hostname to something with test 
     @host = "test.iome:3003" 
     host! @host 
     Capybara.default_host = Capybara.app_host = "http://#{@host}/" 
     Capybara.server_port = 3003 
     Capybara.reset_sessions! 

     # Start the database cleaner 
     config.use_transactional_fixtures = false 
     DatabaseCleaner.start 
    end 

    config.after :each do 
     DatabaseCleaner.clean 
    end 
end 

Und auch mein spec_helper.rb:

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'pry' 

require 'fakeweb' 
FakeWeb.allow_net_connect = false 

Es ist alles ziemlich einfach.

nun in meiner Konsole sehe ich folgendes:

{"name"=>"visit", "args"=>["http://test.iome:3003//login"]} 
{"response"=>{"status"=>"fail"}} 
{"name"=>"body", "args"=>[]} 
{"response"=>"<html><head></head><body></body></html>"} 
<html><head></head><body></body></html> 
{"name"=>"body", "args"=>[]} 
{"response"=>"<html><head></head><body></body></html>"} 
{"name"=>"render", "args"=>["_screenshot.png", true]} 
{"response"=>true} 
{"name"=>"body", "args"=>[]} 
{"response"=>"<html><head></head><body></body></html>"} 

Auch der Screenshot ist nur eine weiße und leere Seite. Wenn ich meine log/test.log Datei ankreuze, sehe ich nicht, dass eine Anfrage ausgeführt wird. Ich habe versucht, die Methode visit zu get zu ändern, und das wird die Anfrage machen, aber wird nichts von den Ergebnissen ändern.

ich komplett haben die Ideen von laufen, was das sein könnte und es ist ziemlich frustrierend :(

Schluss Informationen dann über Versionen:

  • rspec 2.10.0
  • Capybara 1.1.4
  • poltergeist 1.0.3
  • rubin 1.8.7
  • Schienen 3.2.13

Leider sind wir immer noch bei Ruby 1.8.7, arbeiten aber daran, diese Version zu verbessern. Trotzdem denke ich, dass dies die Tests nicht beeinflussen sollte.

Jede Hilfe würde sehr geschätzt werden!

+0

Wenn Sie einfach zu Ihrem Browser gehen und die URL eingeben (d. H. "Http: //test.iome: 3003 /') erhalten Sie eine Antwort? –

+0

Wenn ich die Tests durchführe: ja. Ich schein jetzt ein bisschen mehr zu bekommen. Es ist ein neuer Tag, an dem neue Dinge geschehen. Ich glaube, dass der für die Tests verwendete Port noch immer verwendet wurde und die Anwendung beim Booten eine Zeitüberschreitung verursachte. Es schien, dass Nginx noch lief. Das Attribut 'page.html' hat jetzt auch Inhalt. Während jedoch eine Screenshot-Datei erstellt wurde, die zuvor leer war, wird jetzt keine Datei erstellt. Außerdem füge ich der Datenbank einige Informationen hinzu, die für die Anmeldung erforderlich sind, aber diese Informationen sind für die Anwendung nicht verfügbar. Ich werde Sie über Updates informieren. – Mark

+0

Können Sie den Code für Ihre Controller-Aktion hinzufügen? Ich habe das gleiche Problem und möchte vergleichen! : D –

Antwort

1

So bekam ich schließlich Hilfe von einem Kollegen, und wir haben es geschafft, es zu beheben. Wir haben dafür die Domain lvh.me verwendet, da jede Anfrage an diese Domain in localhost aufgelöst wird, sodass Sie Subdomains ohne Probleme verwenden können. Sie könnten wahrscheinlich auch hostname.127.0.0.1.xip.io dafür verwenden.

Unsere spec_helper.rb sieht nun wie folgt aus:

# Use capybara in combination with poltergeist for integration tests 
require 'capybara/rails' 
require 'capybara/rspec' 
require 'capybara/poltergeist' 
require 'rack_session_access/capybara' 
Capybara.default_driver = :poltergeist 
Capybara.always_include_port = true 
Capybara.app_host = 'http://application-test.lvh.me' # Any lvh.me domain resolves to localhost 
Capybara.default_wait_time = 8      # How long capybara should look for html elements 

require 'vcr' 
VCR.configure do |config| 
    config.cassette_library_dir = 'spec/vcr_cassettes' 
    config.hook_into :fakeweb 
    config.ignore_localhost = true 
    config.configure_rspec_metadata! 
    config.ignore_hosts 'codeclimate.com' 
end 

require 'fakeweb' 
FakeWeb.allow_net_connect = false 

Weil wir in VCR angeschlossen alle Anfragen während der ersten Ausführung der Integrationstests ausgehen aufzeichnen, werden alle Integrationstests oder Funktionen, sollten diesen Code enthalten :

before(:each) do 
    @original_host = Capybara.app_host 
    Capybara.app_host = 'http://does-not-exist.lvh.me' 
    visit '/login' 
end 

after(:each) do 
    Capybara.app_host = @original_host 
end 
:

before(:all) do 
    FakeWeb.allow_net_connect = true 
end 

after(:all) do 
    FakeWeb.allow_net_connect = false 
end 

Wenn Sie die Sub-Domain während Ihren Angaben ändern möchten, können Sie den folgenden verwenden

Das Erstellen von Screenshots kann jetzt unter Verwendung von page.save_screenshot während der Spezifikationen durchgeführt werden. Hoffe das hilft.