Rails 4,RSpec,Capybara& webkit_server

时间:2013-05-07 15:46:49

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

我正在尝试在Rails 4项目中使用带有capybara-webkit的Rspec,但我收到错误,因为没有正确设置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)

2 个答案:

答案 0 :(得分:3)

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

我尝试了几种设置,但最终找到了最佳解决方案,即将所有url更改为path。例如:

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

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

答案 1 :(得分:0)

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