使用rspec,capybara和poltergeist的测试返回空的html和空截图

Mar*_*ark 5 rspec ruby-on-rails capybara phantomjs poltergeist

所以我一直在努力解决这个问题很长一段时间,我似乎无法弄清楚我们出了什么问题,并且找不到可能导致这个问题的原因.

我对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
Run Code Online (Sandbox Code Playgroud)

所以.简单,对.它应该只是去向/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
Run Code Online (Sandbox Code Playgroud)

而且我的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
Run Code Online (Sandbox Code Playgroud)

这一切都相当简单.

现在,在我的控制台中,我看到以下内容:

{"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>"}
Run Code Online (Sandbox Code Playgroud)

此外,屏幕截图只是一个白色和空白页面.当我拖尾log/test.log文件时,我没有看到正在执行请求.我已经尝试将方法更改visitget,并且会发出请求,但不会更改任何结果.

我完全没有想到这可能是什么,这是相当令人沮丧的:(

关于版本的最终信息:

  • rspec 2.10.0
  • 水豚1.1.4
  • 恶作剧者1.0.3
  • 红宝石1.8.7
  • 铁轨3.2.13

不幸的是,我们仍然处于红宝石1.8.7,但正在努力提高该版本.不过,我认为这不应该影响测试.

任何帮助将不胜感激!

小智 1

所以最终我得到了一位同事的帮助,我们设法解决了这个问题。我们lvh.me为此使用了域,因为对该域的任何请求都将在本地主机中解析,从而允许您毫无问题地使用子域。您或许也可以用于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
Run Code Online (Sandbox Code Playgroud)

因为我们连接了 VCR 来记录第一次运行集成测试期间发出的任何请求,所以您的所有集成测试或功能都应包含以下代码:

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

after(:all) do
  FakeWeb.allow_net_connect = false
end
Run Code Online (Sandbox Code Playgroud)

如果您想在规格期间更改子域,可以使用以下命令:

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
Run Code Online (Sandbox Code Playgroud)

现在可以在规格期间使用来完成屏幕截图page.save_screenshot。希望这可以帮助。