2

我正在尝试在 Rails 4 项目中将 Rspec 与 capybara-webkit 一起使用,但由于 Capybara.default_host 设置不正确而出现错误。

webkit_server 已正确安装并位于 PATH 中。

我已将以下 gem 添加到Gemfile

group :test do
  gem 'rspec-rails', "~> 2.12"
  gem 'factory_girl'
  gem 'capybara', '2.0.3'  # capybara-webkit works with this version
  gem 'capybara-webkit'
  gem 'database_cleaner', :git => 'git://github.com/bmabey/database_cleaner.git'
  gem 'email_spec'
end

我的spec_helper.rb除其他外包含:

require 'capybara'
require "capybara-webkit"

RSpec.configure do |config|
  config.include(EmailSpec::Helpers)
  config.include(EmailSpec::Matchers)

  config.include Capybara::DSL, :type => :request

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    DatabaseCleaner.start

  end
  config.after(:each) do
    DatabaseCleaner.start
  end
end

Capybara.default_host = '127.0.0.1:3001'
Capybara.run_server = true
Capybara.javascript_driver = :webkit

这是我的测试

require 'spec_helper'

feature 'A feature' do

  include Capybara::DSL

  scenario 'first scenario', :js => true do

    visit login_url
    page.current_url.should eq('http://127.0.0.1:3001/login')

    ...

  end

end

我得到的错误是:

[16:40:24] paul@Pro2:web $ rspec spec/features/my_spec.rb
Run options: include {:locations=>{"./spec/features/my_spec.rb"=>[165]}}

F

Failures:

  1) A feature - first scenario
     Failure/Error: page.current_url.should eq('http://127.0.0.1:3001/login')

       expected: "http://127.0.0.1:3001/login"
            got: "http://example.iana.org/"

       (compared using ==)
     # ./spec/features/my_spec.rb:8:in `block (2 levels) in <top (required)>'

Finished in 1.69 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/features/my_spec.rb:8 # A feature - first scenario

Randomized with seed 54529

看起来它使用 example.org 作为测试环境的默认主机名。

有什么建议么?

更新:事实证明这不是错误,而是设计使然。解决方案是永远不要使用 *_url 但 *_path (绝对与相对):

visit login_path
page.current_path.should eq(login_path)
4

2 回答 2

3

这个问题不是 Rails 4 特有的。我之前在 Rails 3 中遇到过这个问题。

我尝试了几种设置,但最终发现最好的解决方案是全部更改urlpath. 例如:

visit login_path
page.current_path.should eq('/login')

实际上我们不需要添加主机来使这个测试有意义。通过这种方式,您的测试将不依赖于它们正在运行的任何服务器。无论您、您的同行、CI 服务器等如何。

于 2013-05-07T17:43:57.927 回答
0

您还需要包含require 'capybara/rspec'在您的规范帮助文件中。

于 2013-07-18T14:26:36.517 回答