在导轨中使用RSpec和Capybara时未定义的方法'visit'


89

我无法让水豚与rspec一起工作。它给了我这个错误:

undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x16529f8 @example=nil>

我知道有很多关于此的帖子,但是没有解决方案对我有用。其中大多数涉及的规范不在/ spec / features中-属于我的。

首先是错误:

$bundle exec rspec spec
F

Failures:

  1) security signs users in
     Failure/Error: visit "/sessions/new"
     NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x16529f8 @example=nil>
     # ./spec/features/security_spec.rb:4:in `(root)'

 Finished in 0.006 seconds
 1 example, 1 failure

Failed examples:

rspec ./spec/features/security_spec.rb:3 # security signs users in

我认为重要的是要注意,起初我使用的是URL Helper'new_sessions_path',但它一直给我一个错误undefined local variable or method 'new_sessions_path'。我知道这是有效的,因为:

$ rake routes
logout_sessions GET    /sessions/logout(.:format) sessions#logout
       sessions POST   /sessions(.:format)        sessions#create
   new_sessions GET    /sessions/new(.:format)    sessions#new
      contracts POST   /contracts(.:format)       contracts#create
  new_contracts GET    /contracts/new(.:format)   contracts#new
 edit_contracts GET    /contracts/edit(.:format)  contracts#edit
                GET    /contracts(.:format)       contracts#show
                PUT    /contracts(.:format)       contracts#update
                DELETE /contracts(.:format)       contracts#destroy
           root        /                          contracts#index

我的Gemfile:

source 'https://rubygems.org'

gem 'rails', '3.2.11'
gem 'execjs'

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
gem 'activerecord-oracle_enhanced-adapter', '~> 1.4.1'
gem 'jruby-openssl'
gem 'therubyrhino'
gem 'kaminari'
gem 'nokogiri'

group :development do
  gem 'warbler'
end

group :test do
  gem 'rspec-rails'
  gem 'capybara'
  gem 'activerecord-jdbcsqlite3-adapter'
end

my_app / spec中的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 'rspec/autorun'

# Capybara integration
require 'capybara/rspec'
require 'capybara/rails'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"
  # Include path helpers
  config.include Rails.application.routes.url_helpers
end

my_app / spec / features / security_spec.rb:

describe "security", :type => :feature do
  it "signs users in" do
    visit "/sessions/new"
    fill_in "username", :with => "user"
    fill_in "password", :with => "pass"
    click_button "Sign In"

    page.should have_content('Login Successful')
  end
end

我试过定义上面有和没有的测试:type => :feature。两种方式都没有区别。有什么想法我接下来应该尝试什么?



1
@mlt在第一段中,我说:“我知道有很多关于此的文章,但没有一种解决方案对我有用。它们中的大多数都涉及/ spec / features中没有的规范-属于我的。” 本段专门引用您链接到的问题。这个问题不仅票数更高,而且还提供解决方案-与您所链接问题上投票最高的答案(不是解决方案)不同。
lightswitch05 2013年

Answers:


201

尝试添加:

  config.include Capybara::DSL

到您的配置块。

# 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 'rspec/autorun'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"
  # Include path helpers
  config.include Rails.application.routes.url_helpers

  config.include Capybara::DSL

end

不,完全相同的问题,没有明显的变化
lightswitch13年

8
这对我有用-非常感谢。尽管在其他项目中我也不需要这样做。什么情况使一个项目需要此条件,而另一个项目则不需要?另外,这到底在做什么?
彼得·伯格

1
也为我工作。非常感谢你!
玛丽安(Marian Zagoruiko)2013年

我的文件已经具有要求“ spec_helper”,该文件已作为此问题的答案进行了检查,但这对我有用。谢谢!
2014年

这对我不起作用:我收到一条错误消息,它Capybara是未定义的常量。我的黄瓜测试使用的水豚很好。
digitig 2014年

53

require 'rails_helper'在功能的顶部添加最终解决了我的问题:

require 'rails_helper'

describe "security", :type => :feature do

  it "signs users in" do
    visit new_sessions_path
    fill_in "username", :with => "user"
    fill_in "password", :with => "pass"
    click_button "Sign In"

    page.should have_content('Login Successful')
  end
end

这对我来说似乎很奇怪,因为我在rspec和capybara上看到的每个示例都没有这个要求,但是哦。问题解决了。

原始答案(旧版本的rspec)

require 'spec_helper'由较早版本的RSpec使用。更好的答案是require 'rails_helper'


4
您应该将更新部分放在帖子的顶部。
nistvan 2014年

即使Kocur4d的答案更精确,也很难接受自己的答案(而忘记包含rails_helper.rb不会是更常见的问题)。您应该更改已接受的答案,因为在添加配置之前没有进行任何配置更改,您仍然会遇到相同的错误。
randmin

35

由于Capybara 2.0必须使用文件夹规范/功能,因此Capybara命令不再适用于文件夹规范/请求。


2
正如我的问题的状态,我的水豚测试已经位于下spec/features。但这对可能遇到问题的其他人来说是一个正确的观点。
lightswitch05

我发现创建目录mkdir spec/features和创建符号链接很有帮助ln -s spec/features spec/requests。这样,所有生成的测试都将放置在features目录中。
omarshammas

感谢@ThillaiNarayanan,这是我的问题,它遵循较旧的设置指南,但在更新的
Capybara

5

尝试在一个before块中执行所有设置:

规范/功能/security_spec.rb

describe "security" do
  before do
    visit "/sessions/new"
    fill_in "username", :with => "user"
    fill_in "password", :with => "pass"
    click_button "Sign In"
  end

  it "signs users in" do
    page.should have_content('Login Successful')
  end
end

2
这实际上是错误的常见原因。该visit功能仅在一个it块内可用。光源
lightswitch05 2013年

4
并非如此- before块中的代码在示例上下文中运行,因此visit将在该环境中以及在it块中运行。
zetetic

2
@ user912563,最终,因为您解决了自己的问题,所以我的回答真的比其他任何事情都成为了一种风格建议(在before块中设置代码是我编写规范的方式,并且它们可以正常工作;-)),所以我认为接受您自己的答案很公平。
Paul Fioravanti

感谢@zetetic和@ Paul-Firavanti-我不知道before仍然在it上下文中。使用此功能可以使我的其他需要登录的测试更加整洁
lightswitch05 2013年

这对我有所帮助,因为我是菜鸟,也没有在其中进行测试,所以“ ...结束了。
Danny

3

我也有这个问题

在我的功能顶部添加require'rails_helper'最终解决了我的问题:

require 'rails_helper'

RSpec.describe "Products", type: :request do
 describe "GET /products" do
 it "display tasks" do
  Product.create!(:name => "samsung")
  visit products_path
  page.should have_content("samsung")
  #expect(response).to have_http_status(200)
  end
 end
end

并在rails_helper.rb中添加'config.include Capybara :: DSL'

RSpec.configure do |config|

 config.fixture_path = "#{::Rails.root}/spec/fixtures"

 config.use_transactional_fixtures = true

 config.infer_spec_type_from_file_location!

 config.include Capybara::DSL

end

添加该配置行对我有用。这很奇怪,因为我在我的一个规范文件中得到了错误,而在另一个规范文件中却没有,并且都调用了相同的capy方法(并且都要求使用rails_helper)
Jonathan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.