metode `kunjungan 'yang tidak ditentukan saat menggunakan RSpec dan Capybara di rel

89

Saya tidak bisa membuat kapibara bekerja dengan rspec. Ini memberi saya kesalahan ini:

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

Saya tahu ada banyak posting tentang ini tetapi tidak ada solusi yang berfungsi untuk saya. Kebanyakan dari mereka melibatkan spesifikasi yang tidak ada di / spec / features - yang saya miliki.

Pertama kesalahannya:

$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

Saya pikir penting untuk dicatat bahwa pada awalnya saya menggunakan URL Helper 'new_sessions_path' dan itu terus memberi saya kesalahan undefined local variable or method 'new_sessions_path'. Saya tahu itu valid karena:

$ 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 saya:

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 di dalam my_app / spec:

# 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

aplikasi_saya / spesifikasi / fitur / keamanan_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

Saya sudah mencoba mendefinisikan pengujian di atas dengan dan tanpa :type => :feature. Tidak ada bedanya juga. Ada ide apa yang harus saya coba selanjutnya?

lightswitch05
sumber
2
@mlt di paragraf pertama saya berkata: "Saya tahu ada banyak posting tentang ini tetapi tidak ada solusi yang berfungsi untuk saya. Kebanyakan dari mereka melibatkan spesifikasi yang tidak ada di / spec / fitur - yang saya gunakan." Paragraf ini secara khusus merujuk pada pertanyaan yang Anda tautkan. Pertanyaan ini tidak hanya memiliki suara lebih tinggi, tetapi juga dilengkapi dengan solusi - yang berbeda dari jawaban dengan suara terbanyak (bukan solusi) yang diposting pada pertanyaan tertaut Anda.
lightswitch05

Jawaban:

202

Coba tambahkan:

  config.include Capybara::DSL

ke blok konfigurasi Anda.

# 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
Kocur4d
sumber
Tidak, masalah yang sama persis, tidak ada perubahan yang jelas
lightswitch05
9
Ini berhasil untuk saya - terima kasih banyak. Saya tidak perlu melakukan ini meskipun di proyek saya yang lain. Keadaan apa yang membuat hal ini diperlukan dalam satu proyek, tetapi tidak dalam proyek lain? Juga, apa sebenarnya yang dilakukannya ini?
Peter Berg
1
Bekerja untuk saya juga. Terima kasih banyak!
Marian Zagoruiko
File saya sudah membutuhkan 'spec_helper' yang diperiksa sebagai jawaban untuk masalah ini, tetapi ini berhasil untuk saya. Terima kasih!
sixty4bit
Itu tidak berhasil untuk saya: Saya mendapatkan pesan kesalahan yang Capybaramerupakan konstanta yang tidak ditentukan. Tes ketimun saya menggunakan kapibara dengan baik.
digitig
53

Menambahkan require 'rails_helper'di bagian atas fitur saya akhirnya memperbaiki masalah saya:

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

Ini tampak aneh bagi saya karena setiap contoh yang pernah saya lihat untuk rspec dan kapibara tidak memiliki persyaratan itu, tapi oh baiklah. Masalah terpecahkan.

Jawaban Asli (versi rspec yang lebih lama)

require 'spec_helper'digunakan oleh RSpec versi lama. Jawaban yang lebih baik adalah require 'rails_helper'.

lightswitch05
sumber
4
Anda harus meletakkan bagian pembaruan di bagian atas posting Anda.
nistvan
Benar-benar cara yang buruk untuk menerima jawaban sendiri, meskipun jawaban Kocur4d lebih tepat (dan lupa menyertakan rails_helper.rb bukan masalah yang lebih umum). Anda harus mengubah jawaban yang diterima, karena tanpa perubahan konfigurasi yang dilakukan sebelum memasukkannya, Anda masih akan mendapatkan kesalahan yang sama.
randmin
36

Sejak Capybara 2.0 seseorang harus menggunakan spesifikasi / fitur folder Perintah Capybara tidak lagi berfungsi dalam spesifikasi / permintaan folder.

Thillai Narayanan
sumber
2
Sebagai negara pertanyaan saya, tes kapibara saya itu sudah berada di bawah spec/features. Tapi itu adalah poin yang valid untuk orang lain yang mungkin mengalami masalah.
lightswitch05
Saya merasa terbantu dengan membuat direktori mkdir spec/featuresdan membuat tautan simbolis ln -s spec/features spec/requests. Dengan cara ini semua tes yang dihasilkan akan ditempatkan di direktori fitur.
omarshammas
Terima kasih @ThillaiNarayanan, ini adalah masalah saya mengikuti panduan penyiapan yang lebih lama, tetapi pada versi Kapibara yang lebih baru
VegaStudios
5

Coba lakukan semua penyiapan Anda dalam satu beforeblok:

spec / fitur / 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
Paul Fioravanti
sumber
2
Ini sebenarnya penyebab umum kesalahan. The visitFungsi ini hanya tersedia dalam itblok. Sumber
lightswitch05
4
Tidak benar - kode dalam beforeblok berjalan dalam konteks contoh, jadi visitakan bekerja di sana juga di itblok.
zetetic
2
@ user912563, pada akhirnya, karena Anda memecahkan masalah Anda sendiri, jawaban saya benar-benar menjadi saran gaya lebih dari apa pun (mengatur kode dalam beforeblok adalah bagaimana saya menulis spesifikasi saya, dan mereka bekerja tanpa kesalahan ;-)), jadi saya pikir cukup adil untuk menerima jawaban Anda sendiri.
Paul Fioravanti
Terima kasih @zetetic dan @ Paul-Firavanti - Saya tidak tahu beforeapakah masih di dalam itkonteks. Menggunakan ini akan membuat tes saya yang lain yang memerlukan login jauh lebih bersih
lightswitch05
Ini membantu saya karena saya seorang noob dan tidak memiliki tes yang dibungkus di dalamnya "" lakukan ... akhir.
Danny
3

Saya juga punya masalah ini,

Menambahkan memerlukan 'rails_helper' di bagian atas fitur saya akhirnya memperbaiki masalah saya:

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

Dan tambahkan 'config.include Capybara :: DSL' di 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
Sathibabu P.
sumber
Menambahkan baris Config itu berhasil untuk saya. Aneh karena saya mendapatkan kesalahan di salah satu file spesifikasi saya tetapi tidak di file spesifikasi lain, dan keduanya disebut metode capy yang sama (dan keduanya memerlukan rails_helper)
Jonathan Tuzman