วิธีการที่ไม่ได้กำหนด `` เยี่ยมชม 'เมื่อใช้ RSpec และ Capybara ในราง


90

ฉันไม่สามารถให้ capybara ทำงานกับ rspec ได้ มันทำให้ฉันมีข้อผิดพลาดนี้:

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

ฉันรู้ว่ามีโพสต์มากมายเกี่ยวกับเรื่องนี้ แต่ไม่มีวิธีแก้ปัญหาใดที่ใช้ได้ผลสำหรับฉัน ส่วนใหญ่เกี่ยวข้องกับสเปคที่ไม่อยู่ใน / spec / คุณสมบัติ - ที่ของฉันอยู่

ก่อนอื่นข้อผิดพลาด:

$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 Helper '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

spec_helper.rb ภายใน 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

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ฉันได้พยายามกำหนดทดสอบข้างต้นทั้งที่มีและไม่มี ไม่มีความแตกต่างทั้งสองทาง มีความคิดใดที่ฉันควรลองทำต่อไป



2
@mlt ในย่อหน้าแรกฉันพูดว่า: "ฉันรู้ว่ามีโพสต์มากมายเกี่ยวกับเรื่องนี้ แต่ไม่มีวิธีแก้ปัญหาสำหรับฉันส่วนใหญ่เกี่ยวข้องกับข้อกำหนดที่ไม่อยู่ใน / ข้อมูลจำเพาะ / คุณสมบัติซึ่งเป็นของฉัน" ย่อหน้านี้อ้างถึงคำถามที่คุณเชื่อมโยงโดยเฉพาะ คำถามนี้ไม่เพียง แต่มีคะแนนโหวตสูงกว่า แต่ยังมาพร้อมกับวิธีแก้ปัญหาซึ่งแตกต่างจากคำตอบที่ได้รับการโหวตสูงสุด (ไม่ใช่วิธีแก้ปัญหา) ที่โพสต์ไว้ในคำถามที่เชื่อมโยงของคุณ
lightswitch05

คำตอบ:


203

ลองเพิ่ม:

  config.include Capybara::DSL

ไปยังบล็อก config ของคุณ

# 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

9
สิ่งนี้ได้ผลสำหรับฉัน - ขอบคุณมาก ฉันไม่จำเป็นต้องทำสิ่งนี้ในโครงการอื่น ๆ ของฉัน สถานการณ์ใดที่ทำให้สิ่งนี้จำเป็นในโครงการหนึ่ง แต่ไม่ใช่อีกโครงการหนึ่ง นอกจากนี้สิ่งนี้กำลังทำอะไรอยู่?
Peter Berg

1
ทำงานให้ฉันเช่นกัน ขอบคุณมาก!
Marian Zagoruiko

ไฟล์ของฉันมี 'spec_helper' ที่ต้องการอยู่แล้วซึ่งถูกตรวจสอบเพื่อตอบปัญหานี้ แต่สิ่งนี้ใช้ได้ผลสำหรับฉัน ขอบคุณ!
sixty4bit

นั่นไม่ได้ผลสำหรับฉัน: ฉันได้รับข้อความแสดงข้อผิดพลาดที่Capybaraเป็นค่าคงที่ที่ไม่ได้กำหนด การทดสอบแตงกวาของฉันใช้ Capybara ได้ดี
digitig

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
คุณควรใส่ส่วนการอัปเดตไว้ที่ด้านบนของโพสต์
nistvan

เป็นเรื่องที่แย่มากที่ต้องยอมรับคำตอบของตัวเองแม้ว่าคำตอบของ Kocur4d จะแม่นยำกว่า (และการลืมใส่ rail_helper.rb จะไม่ใช่ปัญหาที่พบบ่อย) คุณควรเปลี่ยนคำตอบที่ยอมรับเนื่องจากไม่มีการเปลี่ยนแปลงการกำหนดค่าก่อนที่จะรวมคำตอบคุณจะยังคงมีข้อผิดพลาดเดิม
randmin

36

เนื่องจาก Capybara 2.0 ต้องใช้โฟลเดอร์ spec / features คำสั่ง Capybara จึงไม่ทำงานในข้อมูลจำเพาะ / คำขอของโฟลเดอร์อีกต่อไป


2
ฐานะที่เป็นรัฐคำถามของฉันทดสอบ capybara ของฉันได้รับspec/featuresอยู่แล้วภายใต้ แต่นั่นเป็นจุดที่ถูกต้องสำหรับคนอื่น ๆ ที่อาจมีปัญหา
lightswitch05

ฉันพบว่าการสร้างไดเร็กทอรีmkdir spec/featuresและสร้างลิงก์สัญลักษณ์มีln -s spec/features spec/requestsประโยชน์ ด้วยวิธีนี้การทดสอบที่สร้างขึ้นจะถูกวางไว้ในไดเรกทอรีคุณลักษณะ
omarshammas

ขอบคุณ @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บล็อกคือวิธีที่ฉันเขียนสเปคของฉันและทำงานได้โดยไม่มีข้อผิดพลาด ;-)) ดังนั้นฉันจึงคิดว่า มันยุติธรรมที่จะยอมรับคำตอบของคุณเอง
Paul Fioravanti

ขอบคุณ @zetetic และ @ Paul-Firavanti - ฉันไม่รู้ว่าbeforeยังอยู่ในitบริบท การใช้สิ่งนี้จะทำให้การทดสอบอื่น ๆ ของฉันที่ต้องเข้าสู่ระบบสะอาดขึ้นมาก
lightswitch05

สิ่งนี้ช่วยฉันได้เพราะฉันเป็น noob และไม่มีการทดสอบมาด้วย "" ทำ ... จบ.
Danny

3

ฉันก็มีปัญหานี้เช่นกัน

การเพิ่มต้องการ 'rail_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' ใน rail_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 นั้นใช้ได้ผลสำหรับฉัน มันแปลกเพราะฉันได้รับข้อผิดพลาดในไฟล์ข้อมูลจำเพาะของฉัน แต่ไม่ได้อยู่ในไฟล์ข้อมูลจำเพาะอื่นและทั้งสองเรียกว่าเมธอด capy เดียวกัน (และทั้งสองต้องใช้ rail_helper)
Jonathan Tuzman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.