所以我一直在努力解决这个问题很长一段时间,我似乎无法弄清楚我们出了什么问题,并且找不到可能导致这个问题的更多内容。
我对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
,并且会发出请求,但不会更改任何结果。
我完全没有想到这可能是什么,而且相当令人沮丧:(
关于版本的最终信息:
不幸的是我们仍然处于ruby 1.8.7,但正在努力推出该版本。不过,我认为这不应该影响测试。
非常感谢任何帮助!
答案 0 :(得分: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
制作屏幕截图。希望这会有所帮助。