Raylarda RSpec ve Capybara kullanırken tanımlanmamış yöntem `` ziyaret ''


90

Capybara'nın rspec ile çalışmasını sağlayamıyorum. Bana şu hatayı veriyor:

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

Bununla ilgili çok sayıda gönderi olduğunu biliyorum ama çözümlerin hiçbiri benim için işe yaramıyor. Çoğu, benimki olan / spec / features içinde bulunmayan özellikleri içerir.

Önce hata:

$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

İlk başta 'new_sessions_path' URL Yardımcısı'nı kullandığımı ve bana bir hata vermeye devam ettiğini not etmenin önemli olduğunu düşünüyorum undefined local variable or method 'new_sessions_path'. Bunun geçerli olduğunu biliyorum çünkü:

$ 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'ım:

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 içinde 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

Yukarıda testi hem olan hem de olmayan tanımlamayı denedim :type => :feature. Her iki şekilde de fark etmez. Bundan sonra ne denemem gerektiğine dair bir fikrin var mı?


Olası
Capibara

2
İlk paragrafta @mlt dedim: "Bununla ilgili çok sayıda gönderi olduğunu biliyorum, ancak çözümlerin hiçbiri benim için işe yaramıyor. Çoğu, benimki olan / spec / features içinde olmayan özelliklerle ilgili." Bu paragraf özellikle bağlantı kurduğunuz soruya atıfta bulunuyor. Bu soru yalnızca daha yüksek oylara sahip olmakla kalmaz, aynı zamanda bağlantılı sorunuzda yayınlanan en yüksek oyu alan yanıttan (çözüm değil) farklı bir çözümle birlikte gelir.
lightswitch05

Yanıtlar:


203

Eklemeyi deneyin:

  config.include Capybara::DSL

yapılandırma bloğunuza.

# 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

Hayır,
lightswitch05

9
Bu benim için çalıştı - çok teşekkürler. Diğer projelerimde bunu yapmama gerek yoktu. Hangi koşullar bunu bir projede gerekli kılarken başka bir projede gerekli kılar? Ayrıca, bu tam olarak ne yapıyor?
Peter Berg

1
Benim için de çalıştı. Çok teşekkür ederim!
Marian Zagoruiko

Dosyam zaten bu soruna yanıt olarak kontrol edilen 'spec_helper' gereksinimine sahipti, ancak bu benim için çalıştı. Teşekkürler!
sixty4bit

Bu benim için işe yaramıyor: CapybaraTanımsız sabit olan bir hata mesajı alıyorum . Hıyar testlerim Capybara kullanıyor.
digitig

53

require 'rails_helper'Özelliğimin üst kısmına eklemek sorunumu çözdü:

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

Bu bana tuhaf geliyor çünkü rspec ve capybara için gördüğüm her örnekte bunu gerektirmiyordu, ama çok iyi. Sorun çözüldü.

Orijinal Cevap (rspec'in eski sürümleri)

require 'spec_helper'RSpec'in eski sürümleri tarafından kullanılır. Daha iyi cevap olurdu require 'rails_helper'.


4
Güncelleme kısmını gönderinizin en üstüne koymalısınız.
nistvan

Kocur4d'nin cevabı daha kesin olsa da (ve rails_helper.rb'yi eklemeyi unutmak daha yaygın bir sorun olmayacaktır) bile, kendi cevabını kabul etmek gerçekten kötü bir davranış. Kabul edilen yanıtı değiştirmelisiniz, çünkü dahil etmeden önce yapılandırma değişikliği yapılmazsa, yine de aynı hataya sahip olursunuz.
randmin

36

Capybara 2.0'dan beri klasör özelliklerini / özelliklerini kullanmak zorunda olan Capybara komutları artık klasör özellikleri / isteklerinde çalışmıyor.


2
Sorum devletler gibi, benim Kapibara testi yapıldı zaten altında bulunan spec/features. Ancak bu, sorunları olabilecek diğer insanlar için geçerli bir noktadır.
lightswitch05

Dizini mkdir spec/featuresoluşturmayı ve sembolik bir bağlantı oluşturmayı yararlı buluyorum ln -s spec/features spec/requests. Bu şekilde, üretilen tüm testler özellikler dizinine yerleştirilecektir.
omarshammas

Teşekkürler @ThillaiNarayanan, bu eski bir kurulum kılavuzundan sonra benim sorunumdu, ancak daha yeni bir Capybara sürümünde
VegaStudios

5

Tüm kurulumunuzu bir beforeblokta gerçekleştirmeyi deneyin :

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
Bu aslında hatanın yaygın bir nedenidir . visitİşlevi içinden kullanılabilir itblokta. Kaynak
lightswitch05

4
Doğru değil - bir beforebloktaki kod örnek bağlamda çalışır, bu nedenle visitorada olduğu kadar bir itblokta da çalışacaktır .
zetetic

2
@ user912563, nihayetinde, kendi probleminizi çözdüğünüze göre, cevabım her şeyden daha çok bir stil önerisi haline geliyor ( beforebloklar halinde kod oluşturmak benim özelliklerimi nasıl yazıyorum ve hatasız çalışıyorlar ;-)), bu yüzden düşünüyorum Kendi cevabınızı kabul etmeniz adil.
Paul Fioravanti 13

Teşekkürler @zetetic ve @ Paul-Firavanti - beforeHala itbağlamın içinde olduğunu bilmiyordum . Bunu kullanmak, oturum
açmayı

Bu bana yardımcı oldu çünkü ben bir çaylağım ve "" yap ... bitir.
Danny

3

Ben de bu problemi yaşadım

Özelliğimin üst kısmına 'rails_helper' gereksinimi eklemek sorunumu çözdü:

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

Ve rails_helper.rb dosyasına 'config.include Capybara :: DSL' ekleyin

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

Bu Config satırını eklemek benim için çalıştı. Garip çünkü özellik dosyalarımdan birinde hata alıyordum, ancak başka bir özellik dosyasında değil ve her ikisi de aynı capy yöntemlerini (ve her ikisi de gerekli rails_helper) çağırdı
Jonathan Tuzman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.