【问题标题】:Rails 4, RSpec, Capybara & webkit_serverRails 4、RSpec、Capybara 和 webkit_server
【发布时间】:2013-05-07 15:46:49
【问题描述】:

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

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

我已将以下宝石添加到 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)

【问题讨论】:

    标签: rspec capybara ruby-on-rails-4 capybara-webkit


    【解决方案1】:

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

    我尝试了几种设置,但最终发现最好的解决方案是将所有url更改为path。例如:

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多