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

私の 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。どちらの方法でも違いはありません。次に何を試すべきか?

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 以降、フォルダー仕様/機能を使用する必要があります。カピバラ コマンドは、フォルダー仕様/要求では機能しなくなりました。

于 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 アプリからアップグレードするときに発生するアップグレードの問題以外にrequire 'rails_helper.rb'、これは 3 つの既知の理由で発生します。

1.仕様は「機能」タイプではありません。 これは、カピバラがJavascriptまたはブラウザを使用して実行する方法を知らないことを意味します。次の 2 つのいずれかを行います。1) 通常、config.infer_spec_type_from_file_location!RSpec.configure で設定する必要があります。これは、features フォルダーにあるものが機能になることを意味します。

非標準のものがある場合はtype: :feature、仕様の記述ブロックに追加してその仕様を機能に変えることができますが、通常はそれらを /features フォルダーに入れて推論設定に任せる方が簡単です。

2. 誤っvisitて it ブロックの外側を入れてしまった

訪問は、記述内にある it 内にある必要があります。説明内に訪問を直接入れないようにしてください。

3. 目に見えない他のカーネル パニックにより、Capy は仕様をシャットダウンしました。

これは診断するのが難しいものですが、私はそれを見てきました。これは、Capy が実際にこのファイルを正しく解析しなかったことを意味します。そのため、visit ブロックに到達したときに、どういうわけか適切な範囲にありません。Capy の仕様を慎重に分析して、導入した場所を特定します。

今日はカーネル パニックを引き起こしましたが、letブロックを呼び出す必要がありますpage(おっと)。pageここでは、Rspec または Capy の予約語のように見えます。これはカーネル パニックを引き起こし、仕様が解析されvisitず、メソッドが見つからない原因となります。

私の場合、これを変更するだけでした:

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

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

この単語pageは Rails によって予約されておらず、データベース名としてもモデル名としても正常に機能しますが、pageここで let 変数名として使用する特定の構造により、Capy がちょっとおかしくなっているように見えました。

于 2022-02-14T11:59:54.633 に答える