phương pháp không xác định `` thăm '' khi sử dụng RSpec và Capybara trong đường ray


89

Tôi không thể làm cho capybara làm việc với rspec. Nó cho tôi lỗi này:

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

Tôi biết có rất nhiều bài đăng về điều này nhưng không có giải pháp nào phù hợp với tôi. Hầu hết chúng liên quan đến các thông số kỹ thuật không nằm trong / spec / features - cái của tôi.

Đầu tiên là lỗi:

$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

Tôi nghĩ điều quan trọng cần lưu ý là lúc đầu tôi đang sử dụng Trình trợ giúp URL 'new_sessions_path' và nó liên tục gây ra lỗi cho tôi undefined local variable or method 'new_sessions_path'. Tôi biết nó hợp lệ vì:

$ 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 của tôi:

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 bên trong 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

Tôi đã thử xác định thử nghiệm ở trên cả có và không :type => :feature. Nó không có gì khác biệt cả. Bất kỳ ý tưởng gì tôi nên thử tiếp theo?



1
@mlt trong đoạn đầu tiên, tôi đã nói: "Tôi biết có rất nhiều bài đăng về vấn đề này nhưng không có giải pháp nào phù hợp với tôi. Hầu hết chúng liên quan đến thông số kỹ thuật không nằm trong / spec / features - mà tôi đang ở trong đó." Đoạn này đề cập cụ thể đến câu hỏi mà bạn liên kết đến. Câu hỏi này không chỉ có số phiếu bầu cao hơn, mà còn đi kèm với một giải pháp - khác với câu trả lời được bình chọn cao nhất (không phải giải pháp) được đăng trên câu hỏi được liên kết của bạn.
lightswitch 05

Câu trả lời:


201

Cố gắng thêm:

  config.include Capybara::DSL

vào khối cấu hình của bạn.

# 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

Không, vấn đề tương tự chính xác, không có thay đổi rõ ràng
lightswitch05

8
Điều này đã làm việc cho tôi - cảm ơn rất nhiều. Tôi không cần phải làm điều này mặc dù trong các dự án khác của tôi. Những trường hợp nào sẽ khiến điều này trở nên cần thiết trong một dự án mà không phải trong một dự án khác? Ngoài ra, chính xác thì điều này đang làm gì?
Peter Berg

1
Làm việc cho tôi là tốt. Cảm ơn rât nhiều!
Marian Zagoruiko

Tệp của tôi đã có yêu cầu 'spec_helper' đã được kiểm tra tùy theo câu trả lời cho vấn đề này, nhưng điều này đã hiệu quả với tôi. Cảm ơn!
sixty4bit

Điều đó không hiệu quả với tôi: Tôi nhận được thông báo lỗi Capybaralà một hằng số không xác định. Các bài kiểm tra Cucumber của tôi đang sử dụng Capybara tốt.
hóa

53

Việc thêm require 'rails_helper'vào đầu tính năng của tôi đã giải quyết được sự cố của tôi:

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

Điều này có vẻ kỳ lạ đối với tôi vì mọi ví dụ tôi đã thấy cho rspec và capybara không có yêu cầu đó, nhưng thật tuyệt. Vấn đề đã được giải quyết.

Câu trả lời gốc (phiên bản cũ hơn của rspec)

require 'spec_helper'được sử dụng bởi các phiên bản RSpec cũ hơn. Câu trả lời tốt hơn sẽ là require 'rails_helper'.


4
Bạn nên đặt phần cập nhật lên đầu bài đăng của mình.
nistvan

Việc chấp nhận câu trả lời của chính mình là một cách thực sự tồi tệ, mặc dù câu trả lời của Kocur4d chính xác hơn (và việc quên bao gồm rails_helper.rb sẽ không phải là vấn đề phổ biến hơn). Bạn nên thay đổi câu trả lời được chấp nhận, vì nếu không thực hiện thay đổi cấu hình trước khi bao gồm nó, bạn sẽ vẫn gặp lỗi tương tự.
randmin

35

Vì Capybara 2.0 người ta phải sử dụng đặc điểm / tính năng thư mục Các lệnh Capybara không hoạt động trong đặc điểm / yêu cầu thư mục nữa.


2
Như câu hỏi của tôi đã nêu, bài kiểm tra capybara của tôi đã được định vị spec/features. Nhưng đó là một điểm hợp lệ cho những người khác có thể gặp vấn đề.
lightswitch

Tôi thấy hữu ích khi tạo thư mục mkdir spec/featuresvà tạo liên kết tượng trưng ln -s spec/features spec/requests. Bằng cách này, mọi thử nghiệm đã tạo sẽ được đặt trong thư mục tính năng.
omarshammas

Cảm ơn @ThillaiNarayanan, đây là vấn đề của tôi sau một hướng dẫn thiết lập cũ, nhưng trên phiên bản mới hơn Capybara
VegaStudios

5

Hãy thử thực hiện tất cả thiết lập của bạn trong một beforekhối:

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
Đây thực sự là một nguyên nhân phổ biến của lỗi. Các visitchức năng chỉ có sẵn trong một itkhối. Nguồn
lightswitch 05

4
Không đúng - mã trong một beforekhối chạy trong ngữ cảnh ví dụ, vì vậy visitsẽ hoạt động ở đó cũng như trong một itkhối.
zetetic

2
@ user912563, cuối cùng, vì bạn đã giải quyết được vấn đề của chính mình, câu trả lời của tôi thực sự trở thành một gợi ý về phong cách hơn bất kỳ thứ gì khác (thiết lập mã theo beforekhối là cách tôi viết thông số kỹ thuật của mình và chúng hoạt động mà không có lỗi ;-)), vì vậy tôi nghĩ thật công bằng khi chấp nhận câu trả lời của chính bạn.
Paul Fioravanti

Cảm ơn @zetetic và @ Paul-Firavanti - Tôi không biết beforevẫn còn bên trong itbối cảnh. Sử dụng điều này sẽ làm cho các thử nghiệm khác của tôi yêu cầu đăng nhập trở nên gọn gàng hơn nhiều
lightswitch. 05

Điều này đã giúp tôi vì tôi là một người không có kinh nghiệm và không có bài kiểm tra nào được bao gồm trong đó "" làm ... kết thúc.
Danny

3

Tôi cũng đã từng gặp phải vấn đề này,

Việc thêm yêu cầu 'rails_helper' ở đầu tính năng của tôi đã giúp tôi khắc phục được sự cố:

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

Và thêm 'config.include Capybara :: DSL' trong 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

Thêm dòng Cấu hình đó đã làm việc cho tôi. Thật kỳ lạ bởi vì tôi đã nhận được báo lỗi trong một file spec của tôi nhưng không phải trong một file spec, và cả hai được gọi là phương pháp capy cùng (và cả rails_helper bắt buộc)
Jonathan Tuzman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.