2013-07-09 8 views
5

Tak więc zmagałem się z tym od dłuższego czasu i nie potrafię zrozumieć, co dzieje się źle, i nie mogłem znaleźć wiele na temat może spowodować ten problem.Testy używające rspec, kapibara i poltergeista zwracają puste html i puste zrzuty ekranu

Jestem względnie nowy w Ruby and Rails, a także w rozwoju opartym na testach i zachowaniu i próbuję napisać kilka testów akceptacji (przeglądarki) za pomocą PhantomJS przez Poltergeist, używając Rspec i Capybara. Wierzę, że niektórzy ludzie nazywają te testy integracyjne (mogą być z jakiejś perspektywy), ale to jest cała inna dyskusja.

Mam bardzo prostą funkcję, że nie mogę dostać się do tego, co chcę:

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. Proste, prawda. Powinien po prostu przejść do /login i wrzucić zawartość HTML do mnie, a także chcę zobaczyć stronę za pomocą save_and_open_page i chcę, aby zrobił zrzut ekranu. Dodałem prosty should have_selector, aby test zakończył się niepowodzeniem, aby uzyskać więcej informacji zwrotnych.

Względne zawartość mojego 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 

a także moje 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 

To wszystko jest dość prosta.

Teraz, w moim konsoli widzę następujące:

{"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>"} 

Również screenshot jest tylko biała i pusta strona. Kiedy kończę mój plik log/test.log, nie widzę, że wykonywane jest żądanie. Próbowałem zmienić metodę visit na get, a to spowoduje żądanie, ale nie zmieni żadnego z wyników.

mam całkowicie zabrakło pomysłów co to może być i jest to dość frustrujące :(informacji

końcowy następnie o wersjach:

  • rspec 2.10.0
  • Kapibara 1.1.4
  • poltergeist 1.0.3
  • Ruby 1.8.7
  • szyny 3.2.13

Niestety nadal jesteśmy w ruby ​​1.8.7, ale pracujemy nad podskoczeniem tej wersji. Myślę jednak, że nie powinno to wpłynąć na testy.

Każda pomoc będzie bardzo ceniona!

+0

Jeśli po prostu przejdziesz do przeglądarki i wpiszesz URL (np. "Http: //test.iome: 3003 /") otrzymasz odpowiedź? –

+0

Kiedy przeprowadzam testy: tak. Wydaje mi się jednak, że teraz trochę więcej. To nowy dzień, więc dzieje się coś nowego :) Sądzę, że port używany do testów był nadal w użyciu, co spowodowało, że aplikacja przestała działać podczas startu. Wyglądało na to, że nginx nadal działa. Atrybut 'page.html' również ma teraz zawartość. Jednak, mimo że plik zrzutu został utworzony, ale wcześniej był pusty, nie tworzy go wcale. Ponadto dodaję pewne informacje do bazy danych wymaganej do logowania, ale ta informacja nie jest dostępna dla aplikacji. Poinformuje Cię o aktualizacjach. – Mark

+0

Czy możesz dodać kod do działania kontrolera? Mam ten sam problem i chcę go porównać! :RE –

Odpowiedz

1

W końcu otrzymałem pomoc od kolegi i udało nam się to naprawić. Użyliśmy do tego domeny lvh.me, ponieważ każde żądanie do tej domeny zostanie rozwiązane w localhost, co umożliwi ci korzystanie z subdomen bez problemu. Prawdopodobnie możesz również użyć do tego celu hostname.127.0.0.1.xip.io.

Nasz spec_helper.rb teraz wygląda tak:

# 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 

Ponieważ zaczepione w magnetowidzie nagrać jakieś wnioski dzieje się podczas pierwszego uruchomienia testów integracyjnych, wszystkie testy integracyjne, lub funkcji, powinno zawierać ten kod :

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

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

Jeśli chcesz zmienić subdomeny podczas swoich specyfikacji, można użyć następujących:

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 

Tworzenie zrzutów ekranu można teraz wykonać za pomocą page.save_screenshot podczas specyfikacji. Mam nadzieję że to pomoże.

Powiązane problemy