Ruby on rails 未定义的方法`访问';在rails中使用RSpec和Capybara时

Ruby on rails 未定义的方法`访问';在rails中使用RSpec和Capybara时,ruby-on-rails,ruby,rspec,capybara,Ruby On Rails,Ruby,Rspec,Capybara,我不能让水豚和rspec合作。它给了我这个错误: undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x16529f8 @example=nil> 我的档案: 源代码'https://rubygems.org' gem“轨道”,“3.2.11” gem'execjs' 集团:资产做什么 gem'sass-rails',“~>3.2.3” gem“咖啡轨”,“~>3.2.1” gem'uglifie

我不能让水豚和rspec合作。它给了我这个错误:

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

源代码'https://rubygems.org'
gem“轨道”,“3.2.11”
gem'execjs'
集团:资产做什么
gem'sass-rails',“~>3.2.3”
gem“咖啡轨”,“~>3.2.1”
gem'uglifier','>=1.0.3'
结束
gem'jqueryrails'
gem'activerecord-oracle_增强型适配器',“~>1.4.1”
gem“jruby openssl”
宝石“therubyrhino”
宝石“卡米纳里”
宝石“nokogiri”
小组:发展怎么办
宝石“莺”
结束
组:测试do
gem'rspec rails'
宝石“水豚”
gem'activerecord-jdbcsqlite3-adapter'
结束
我的_应用程序/spec中的spec_helper.rb:

#运行“rails生成rspec:install”时,此文件将复制到spec/中
环境[“RAILS_ENV”]| |=“测试”
需要文件。展开\u路径(“../../config/environment”,\u文件\u)
需要“rspec/rails”
需要“rspec/自动运行”
#水豚积分
需要“水豚/rspec”
需要“水豚/铁轨”
#需要支持带有自定义匹配器和宏等的ruby文件,
#在spec/support/及其子目录中。
Dir[Rails.root.join(“spec/support/***.rb”)]。每个{f |都需要f}
RSpec.configure do | config|
#如果不使用ActiveRecord或ActiveRecord设备,请删除此行
#config.fixture_path=“#{::Rails.root}/spec/fixtures”
config.use\u transactional\u fixtures=true
config.expert\u base\u class\u for\u anonymous\u controllers=false
config.order=“随机”
#包括路径帮助程序
config.include Rails.application.routes.url\u helpers
结束
我的应用程序/spec/features/security\u spec.rb:

描述“安全性”,类型=>:featuredo
它“在”do“中为用户签名”
访问“/会话/新”
填写“用户名”:使用=>“用户”
填写“密码”:使用=>“通过”
单击按钮“登录”
第页应包含内容(“登录成功”)
结束
结束
我已经尝试过定义上面的测试,包括
:type=>:feature
。这两种方式都没有区别。你知道我下一步应该尝试什么吗?

尝试添加:

  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

在我的功能顶部添加
require'rails\u helper'
,最终解决了我的问题:

require'rails\u helper'
描述“安全性”,类型=>:featuredo
它“在”do“中为用户签名”
访问新的\u会话\u路径
填写“用户名”:使用=>“用户”
填写“密码”:使用=>“通过”
单击按钮“登录”
第页应包含内容(“登录成功”)
结束
结束
这对我来说似乎很奇怪,因为我在rspec和水豚身上看到的每一个例子都没有这个要求,但是哦,好吧。问题解决了

原始答案(rspec的旧版本)
require'spec\u helper'
由旧版本的RSpec使用。更好的答案是
需要“rails\u helper”

块之前尝试在
中执行所有设置:

spec/features/security\u 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

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

我也遇到了这个问题

在我的功能顶部添加require'rails\u 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\u 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

不,完全相同的问题,没有明显的变化。这对我很有效——非常感谢。但在我的其他项目中,我不需要这样做。在什么情况下,一个项目需要这样做,而另一个项目则不需要这样做?还有,这到底是干什么的?对我来说也很有用。非常感谢你!我的文件中已经有了require'spec_helper',作为这个问题的答案进行了检查,但这对我来说很有效。谢谢这对我来说不起作用:我收到一条错误消息,
Capybara
是一个未定义的常量。我的黄瓜测试使用水豚很好。这实际上是一个常见的错误原因。
visit
功能仅在
it
块中可用。不正确-在示例上下文中运行
块之前的
中的代码,因此
访问
将在那里以及
it
块中工作。@user912563,最终,由于您解决了自己的问题,我的答案实际上更像是一个风格建议(在
before
块中设置代码是我编写规范的方式,它们不会出错;-),所以我认为接受你自己的答案是公平的。谢谢@zettetic和@Paul Firavanti-我不知道
之前的
仍然在
it
上下文中。使用此选项将使我的其他需要登录的测试变得更加干净。这对我很有帮助,因为我是一个noob,没有将测试包装在其中。。。结束。正如我的问题所述,我的水豚测试已经位于
spec/features
下。但对于其他可能有问题的人来说,这是一个有效的观点。我发现创建目录
mkdir spec/features
并创建一个符号链接
ln-s spec/features spec/requests
很有帮助。这样,任何生成的测试都将被放置在features目录中。感谢@ThillaiNarayanan,这是我在一个较旧的安装指南之后遇到的问题,但是在一个较新的水豚版本中,你应该将更新部分放在文章的顶部。接受自己的答案确实是一种不好的方式,即使Kocur4d的答案更精确(忘记包含rails_helper.rb并不是更常见的问题)。您应该更改已接受的答案,因为在包含之前没有进行配置更改,您仍然会有相同的错误。第一段中@mlt的可能重复说明:“我知道有很多关于这方面的帖子,但没有一个解决方案适合我。其中大多数涉及的规范不在/spec/features中,而我的规范在/spec/features中。“此段落特别引用了您链接到的问题。此问题不仅有较高的投票率,而且还附带了一个解决方案-这与您链接问题上的投票率最高的答案(不是解决方案)不同。添加该配置行对我很有效。