为什么capybara在请求规格中不可用?

使用rspec和capybara处理新的Rails 3.2.9应用程序。

我在Gemfile中有以下内容:

gem 'rspec-rails' gem 'capybara' 

以及spec / spec_helper.rb中的以下内容:

 require 'rspec/rails' require 'capybara/rspec' 

并在spec / requests / asdf_spec.rb中:

 require 'spec_helper' describe 'Asdf' do describe "GET /asdfs" do it "should list asdfs" do visit asdfs_path end end end 

此测试失败:

 Failure/Error: visit asdfs_path NoMethodError: undefined method `visit' for # # ./spec/requests/asdfs_spec.rb:19:in `block (4 levels) in ' 

所以看起来Capybara没有加载。 伙计,为什么不呢? 我觉得我之前已经完成了十几次同样的事情……可能会对一些愚蠢的东西进行消隐。

所以这是一个水豚版2改变。 我找到了这个:

http://alindeman.github.com/2012/11/11/rspec-rails-and-capybara-2.0-what-you-need-to-know.html

这解释了:

升级到capybara 2.0后, 默认情况下,在RSpec请求规范中不会提供 capybara。 相反,已经创建了一种新类型的规范 – 特征规范 – 用于水豚。

要升级到capybara 2.0,您需要做一些事情:

  • 将rspec-rails升级到2.12.0或更高版本
  • 将任何使用capybara的测试从spec / requests移动到spec / features。 Capybara测试使用visit方法并且通常断言对页面。

只是一些额外的信息,任何人有同样的问题与Capybara升级到2.x 查看升级到Capybara 2部分下的rspec-rails文档。

基本上,为了使用Capybara DSL(页面和访问),您必须将现有规格移动到spec/features目录中。 所以你只能在验收测试中使用page & visit 。 没有更多的页面和访问控制器和请求规格。 控制器和请求规范中只允许使用机架测试DSL (get|post|put|delete|head/response.body)

建议使用,但有一种方法可以保持您的规格正常工作:

 RSpec.configure do |c| c.include Capybara::DSL, :example_group => { :file_path => "spec/requests" } end 

文档指出,如果你走这条路,那么你就是压倒了预期的行为而你冒了风险。

并且绝对不要将此作为不升级到Capybara 2.x的理由。 function规格易于使用且易于阅读。 feature只是describe的别名, backgroundbefore的别名, scenariolet given的别名。

希望这有助于任何人对新变化感到困惑。

问题出在水豚gem本身。

gem 'capybara', '1.1.2'解决了这个问题(版本2.0.x失败)