Тесты с использованием rspec, капибары и полтергейста возвращают пустой HTML и пустые скриншоты

Итак, я боролся с этим уже довольно давно, и я не могу понять, что происходит не так, и не смог найти много информации о том, что может вызвать эту проблему.

Я относительно новичок в Ruby и Rails, а также в разработке, основанной на тестах/поведении, и пытаюсь написать некоторые приемочные (браузерные) тесты, используя PhantomJS через Poltergeist, используя Rspec и Capybara. Я полагаю, что некоторые люди также называют это интеграционными тестами (может быть, с какой-то точки зрения), но это совсем другое обсуждение.

У меня есть очень простая функция, с которой я не могу делать то, что хочу:

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

Так. Просто, правильно. Он должен просто перейти к /login и передать мне HTML-контент, а также я хочу увидеть страницу, используя save_and_open_page, и я хочу, чтобы она сделала снимок экрана. Я добавил простую should have_selector, чтобы тест провалился в попытке получить больше отзывов.

Относительное содержание моего 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

А также мой 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

Все достаточно просто.

Теперь в моей консоли я вижу следующее:

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

Кроме того, на скриншоте просто белая и пустая страница. Когда я копаю свой файл log/test.log, я не вижу, что запрос выполняется. Я попытался изменить метод visit на get, и это сделает запрос, но не изменит никаких результатов.

У меня полностью закончились идеи о том, что это может быть, и это довольно расстраивает :(

Окончательная информация о версиях:

  • рспек 2.10.0
  • капибара 1.1.4
  • полтергейст 1.0.3
  • рубин 1.8.7
  • рельсы 3.2.13

К сожалению, мы все еще на ruby ​​​​1.8.7, но работаем над улучшением этой версии. Тем не менее, я думаю, что это не должно влиять на тесты.

Любая помощь будет принята с благодарностью!


person Mark    schedule 09.07.2013    source источник
comment
Если вы просто зайдете в свой браузер и наберете URL-адрес (например, http://test.iome:3003/), вы получите ответ?   -  person Peter Alfvin    schedule 10.07.2013
comment
Когда я запускаю тесты: да. Я, кажется, получить немного больше, хотя сейчас. Это новый день, поэтому происходят новые вещи :) Я полагаю, что порт, используемый для тестов, все еще использовался, что приводило к тайм-ауту приложения при загрузке. Казалось, что nginx все еще работает. Атрибут page.html теперь также имеет содержимое. Однако, хотя файл скриншота был создан, но раньше был пустым, теперь он вообще не создает файл. Кроме того, я добавляю в базу данных некоторую информацию, необходимую для входа в систему, но эта информация недоступна приложению. Сообщит вам об обновлениях.   -  person Mark    schedule 10.07.2013
comment
Можете ли вы добавить код для вашего действия контроллера? У меня такая же проблема, хочу сравнить! :D   -  person Gavin Miller    schedule 17.10.2013


Ответы (1)


Так что в конце концов я получил помощь от коллеги, и нам удалось это исправить. Для этого мы использовали домен lvh.me, так как любой запрос к этому домену будет разрешаться в localhost, что позволит вам без проблем использовать поддомены. Вероятно, вы могли бы также использовать hostname.127.0.0.1.xip.io для этого.

Наш spec_helper.rb теперь выглядит так:

# 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

Поскольку мы подключили VCR для записи любых запросов, исходящих во время первого запуска интеграционных тестов, все ваши интеграционные тесты или функции должны содержать этот код:

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

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

Если вы хотите изменить субдомен во время ваших спецификаций, вы можете использовать следующее:

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

Скриншоты теперь можно делать с помощью page.save_screenshot во время спецификаций. Надеюсь это поможет.

person Mark    schedule 17.12.2013