93

我无法让水豚与 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

我的宝石文件:

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。两种方式都没有区别。有什么想法我接下来应该尝试什么?

4

6 回答 6

208

尝试添加:

  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
于 2013-03-01T00:58:12.230 回答
54

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

于 2013-03-01T02:05:33.380 回答
36

由于 Capybara 2.0 必须使用文件夹规范/功能 Capybara 命令不再在文件夹规范/请求中工作。

于 2013-05-19T08:58:09.827 回答
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
于 2013-03-01T02:06:28.640 回答
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
于 2015-06-26T06:27:30.323 回答
0

require 'spec_helper.rb'除了从旧的 Rails 应用程序使用而不是ugprading 时会遇到的升级问题之外require 'rails_helper.rb',发生这种情况的原因有 3 个:

1. 您的规范不是“功能”类型 ,这意味着 Capybara 不知道如何使用 Javascript 或浏览器运行它。您想做以下两件事之一:1)通常,您希望config.infer_spec_type_from_file_location!在 RSpec.configure 中进行设置,这意味着 features 文件夹中的内容将成为一项功能。

如果您有一些非标准的东西,您可以添加type: :feature到规范描述块以将该规范转换为功能,但通常将它们放入 /features 文件夹并让推断设置完成它的工作会更容易。

2.你不小心把visitit块的外面放了

访问必须在 it 之内,也就是在 describe 之内。确保不要将访问直接放在描述中。

3. 其他一些你看不到的内核恐慌导致 Capy 关闭了规范。

这是一个令人讨厌的诊断,但我已经看到了。这意味着 Capy 实际上并没有正确解析这个文件,因此当它到达访问块时,不知何故不在正确的范围内。仔细挑选您的 Capy 规格以找出您在哪里引入它。

我今天引起了内核恐慌,但有一个let块被称为page(哎呀)。page这里似乎是 Rspec 或 Capy 的保留字,它会导致内核恐慌,从而导致规范无法解析,从而导致visit找不到方法。

就我而言,它只是改变了这一点:

let(:page) {Page.new()} 

let(:content_page) {Page.new()} 

请注意,pageRails 并没有保留这个词,它可以作为数据库名称和模型名称正常工作,但是使用page这里作为 let 变量名称的具体结构似乎导致 Capy 变得有点蹩脚。

于 2022-02-14T11:59:54.633 回答