अपरिभाषित विधि `यात्रा 'जब RSpec और Capybara रेल का उपयोग कर


89

मैं capybara rspec के साथ काम नहीं कर सकता। यह मुझे यह त्रुटि देता है:

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_session_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

माई जेमफाइल:

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 my_app / कल्पना के अंदर:

# 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। इससे कोई फर्क नहीं पड़ता है। कोई भी विचार जो मुझे आगे की कोशिश करनी चाहिए?



1
@ एमएलटी ने पहले पैराग्राफ में कहा: "मुझे पता है कि इस बारे में बहुत सारी पोस्ट हैं लेकिन मेरे लिए समाधान नहीं हैं। उनमें से ज्यादातर में चश्मा शामिल नहीं है / कल्पना / सुविधाओं में - जो मेरा है।" यह अनुच्छेद विशेष रूप से आपके द्वारा लिंक किए गए प्रश्न का संदर्भ दे रहा है। इस प्रश्न में न केवल उच्च वोट होते हैं, बल्कि एक समाधान भी होता है - जो कि आपके जुड़े प्रश्न पर पोस्ट किए गए उच्चतम मतदान जवाब (समाधान) से भिन्न होता है।
lightswitch05

जवाबों:


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
यह मेरे लिए काम किया - एक टन धन्यवाद। मुझे अपनी अन्य परियोजनाओं में हालांकि ऐसा करने की आवश्यकता नहीं थी। किन परिस्थितियों में एक परियोजना में यह आवश्यक होगा, लेकिन दूसरे में नहीं? इसके अलावा, वास्तव में यह क्या कर रहा है?
पीटर बर्ग

1
मेरे लिए भी काम किया। आपका बहुत बहुत धन्यवाद!
मैरियन ज़गोरुको

मेरी फ़ाइल में पहले से ही 'spec_helper' की आवश्यकता थी, जो इस समस्या के लिए asthe उत्तर की जाँच की गई थी, लेकिन इसने मेरे लिए काम किया। धन्यवाद!
साठवाँ

यह मेरे लिए काम नहीं करता है: मुझे एक त्रुटि संदेश मिलता Capybaraहै जो एक अपरिभाषित स्थिर है। मेरे खीरे के परीक्षण Capybara का उपयोग ठीक कर रहे हैं।
14

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 और capybara के लिए देखा है, की आवश्यकता नहीं है, लेकिन ओह अच्छी तरह से। समस्या सुलझ गयी।

मूल उत्तर (rspec के पुराने संस्करण)

require 'spec_helper'RSpec के पुराने संस्करणों द्वारा उपयोग किया जाता है। बेहतर जवाब होगा require 'rails_helper'


4
आपको अपडेट पोस्ट को अपनी पोस्ट के ऊपर रखना चाहिए।
निस्तवन

यह वास्तव में अपने स्वयं के उत्तर को स्वीकार करने का एक बुरा तरीका है, भले ही कोकूर 4 डी का उत्तर अधिक सटीक हो (और रेल्स_हेल्पर को शामिल करना भूल जाता है। अधिक सामान्य समस्या नहीं होगी)। आपको स्वीकार किए गए उत्तर को बदलना चाहिए, जैसा कि इसे शामिल करने से पहले किए गए कॉन्फ़िगरेशन परिवर्तन के बिना, आपके पास अभी भी वही त्रुटि होगी।
रैंडमिन

35

के बाद से Capybara 2.0 एक फ़ोल्डर युक्ति / सुविधाओं का उपयोग करने के लिए है Capybara आदेश फ़ोल्डर युक्ति / अनुरोधों में अब काम नहीं करते हैं।


2
मेरे सवाल राज्यों के रूप में, मेरी capybara परीक्षण किया गया था पहले से ही नीचे स्थित spec/features। लेकिन यह अन्य लोगों के लिए एक वैध बिंदु है जिनके पास समस्याएँ हो सकती हैं।
lightswitch05

मुझे निर्देशिका mkdir spec/featuresबनाने और प्रतीकात्मक लिंक बनाने में मदद मिलती है ln -s spec/features spec/requests। इस तरह से कोई भी जेनरेट किए गए टेस्ट को फीचर डायरेक्टरी में रखा जाएगा।
सर्वांशस

धन्यवाद @ThillaiNarayanan, यह एक पुराने सेटअप गाइड के बाद मेरा मुद्दा था, लेकिन अधिक हाल ही में Capybara संस्करण पर
VegaStudios

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

2
यह वास्तव में त्रुटि का एक सामान्य कारण है। visitसमारोह एक में ही उपलब्ध है itब्लॉक। स्रोत
lightswitch05

4
सच नहीं है - beforeउदाहरण के संदर्भ में एक ब्लॉक में कोड चलता है, इसलिए visitवहां एक itब्लॉक में भी काम करेगा ।
zetetic

2
@ user912563, अंततः, जब से आपने अपनी समस्या हल की है, मेरा जवाब वास्तव में एक स्टाइल सुझाव बन जाता है और कुछ नहीं ( beforeब्लॉक में कोड सेट करना है कि मैं अपने चश्मे कैसे लिखूं, और वे बिना त्रुटि के काम करते हैं ;-)), इसलिए मुझे लगता है कि अपने स्वयं के उत्तर को स्वीकार करना उचित है।
पॉल फियोरवंती 3

धन्यवाद @zetetic और @ पॉल-फिरवंती - मुझे नहीं पता beforeथा कि अभी भी itसंदर्भ के अंदर है। इसका उपयोग करने से मेरे अन्य परीक्षण हो जाएंगे जिनमें प्रवेश के लिए बहुत अधिक क्लीनर की आवश्यकता होगी
lightswitch05

इससे मुझे मदद मिली क्योंकि मैं एक नॉब हूं और इसमें "लिफ़्ट ..." टेस्ट नहीं लिपटा है।
डैनी

3

मुझे भी यह समस्या थी,

मेरी समस्या के शीर्ष पर '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

उस विन्यास रेखा को जोड़ना मेरे लिए काम करता है। यह अजीब है क्योंकि मैं अपनी एक कल्पना फ़ाइल में त्रुटि प्राप्त कर रहा था, लेकिन किसी अन्य कल्पना फ़ाइल में नहीं, और दोनों ने एक ही कैपी विधियों (और दोनों आवश्यक रेल_हेलर) को बुलाया
जोनाथन तुजमान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.