2013-03-01 3 views
80

rspecで動作するcapybaraを取得できません。それは私にこのエラーを与える:RSpecとCapybaraをレールに使用すると、未定義のメソッド `visit '

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

私はそこに多くの記事があることを知っているが、ソリューションのどれも私のために働いていない。それらのほとんどは/スペック/機能にないスペックを必要とする - 鉱山がである

最初のエラー:。

$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:MY_APP /スペックの内部

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 

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 /スペック/機能/ 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の有無にかかわらず、上記のテストを定義しようとしました。どちらにも違いはありません。私は次に何を試してみましょうか?

config.include Capybara::DSL 

あなたのconfigブロックに:

+0

[カピバラ:未定義のメソッド '訪問']の可能性のある重複した最初のparag中(http://stackoverflow.com/questions/9059854/capybara-undefined-method-visit) – mlt

+0

@mlt raph私は言った: "私は知っていますが、これについての多くの記事がありますが、ソリューションのどれも私のために働いていません。それらのほとんどは仕様に含まれていません/仕様/機能 - 私の中にあります。 " この段落は、リンク先の質問を具体的に参照しています。 – lightswitch05

答えて

47

は私の問題を修正終わった:

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

182

追加してください。私の機能の上部にrequire 'rails_helper'を追加

# 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 
+0

全く同じ問題、明白な変更なし – lightswitch05

+7

これは私のために働いた - 感謝するトン。私は他のプロジェクトでこれを行う必要はなかった –

+1

ありがとうございました! –

5

beforeブロック内のすべてのセットアップを実行してください:カピバラ2.0つのフォルダの仕様を使用しているので

スペック/機能/ 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'ブロック内でのみ利用可能です。 [ソース](http://stackoverflow.com/a/11911471/912563) – lightswitch05

+4

真でない - 'before'ブロック内のコードは、サンプルコンテキストで実行されるので、' visit'は 'it' 'ブロック。 – zetetic

+2

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

28

/カピバラコマンドはない機能フォルダ仕様/要求の作業はもうできません。

+1

私の質問によると、私のカピバラテスト**は既に 'spec/features'の下にありました**。しかし、それは問題を抱えているかもしれない他の人々のための有効なポイントです。 – lightswitch05

+0

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

1

私も自分の特徴の上部にある[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カピバラ:: 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 
関連する問題