レールで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ヘルパー '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 2016

回答:


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

いいえ、まったく同じ問題であり、明らかな変化はありません
lightswitch05

8
これは私にとってうまくいきました-トンに感謝します。他のプロジェクトでもこれを行う必要はありませんでした。あるプロジェクトでこれが必要になるが、別のプロジェクトでは必要とならない状況は何ですか?また、これは正確に何をしているのですか?
Peter Berg

1
私のためにも働いた。どうもありがとうございました!
Marian Zagoruiko 2013年

私のファイルには、この問題に対する回答としてチェックされたrequire 'spec_helper'がすでにありましたが、これは私にとってはうまくいきました。ありがとう!
sixty4bit 2014年

それは私にはうまくいきません:Capybara未定義の定数であるエラーメッセージを受け取ります。私のキュウリのテストはカピバラをうまく使用しています。
ディジティグ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とカピバラで見たすべての例には、それが必要でなかったので、これは私には奇妙に思えますが、まあ。問題が解決しました。

元の回答(古いバージョンの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 2013年

ディレクトリmkdir spec/featuresを作成してシンボリックリンクを作成すると便利ln -s spec/features spec/requestsです。このようにして、生成されたテストはfeaturesディレクトリに配置されます。
omarshammas 2013

@ThillaiNarayananに感謝します。これは古いセットアップガイドに続く私の問題でしたが、より新しいCapybaraバージョン
VegaStudios

5

すべての設定をbeforeブロックで実行してみてください:

spec / features / 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ブロック内のコードはサンプルコンテキストで実行されるためvisititブロック内だけでなくそこでも機能します。
zetetic 2013年

2
@ user912563、最終的に、あなたはあなた自身の問題を解決したので、私の答えは本当に何よりもスタイルの提案になります(beforeブロックでコードを設定することが私の仕様を書く方法であり、エラーなしで機能します;-))、私は思うあなた自身の答えを受け入れるのは公正です。
Paul Fioravanti、2013年

@zeteticと@ Paul-Firavantiに感謝-私beforeはまだitコンテキスト内にいることを知りませんでした。これを使用すると、ログインを必要とする他のテストがよりきれいになります
lightswitch05

私は初心者であり、テストをラップしていなかったので、これは私を助けました。
ダニー

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

そして 'config.include Capybara :: DSL'をrails_helper.rbに追加します

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

そのConfig行を追加するとうまくいきました。仕様ファイルの1つでエラーが発生し、別の仕様ファイルではエラーが発生せず、どちらも同じcapyメソッドを呼び出していた(そして両方にrails_helperが必要だった)
Jonathan Tuzman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.