레일에서 RSpec 및 Capybara를 사용할 때 정의되지 않은 방법 'visit'


89

rspec으로 작업하는 카피 바라를 얻을 수 없습니다. 이 오류가 발생합니다.

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

나는 이것에 대한 많은 게시물이 있지만 솔루션이 나를 위해 일하지 않는다는 것을 알고 있습니다. 대부분은 / spec / features에없는 사양을 포함합니다.

먼저 오류 :

$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_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

my_app / spec 내부의 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

위의 테스트를 사용하거나 사용하지 않고 정의하려고 시도했습니다 :type => :feature. 어느 쪽이든 차이가 없습니다. 다음에 시도해야 할 아이디어가 있습니까?



1
첫 번째 단락에서 @mlt는 다음과 같이 말했습니다. "이에 대한 많은 게시물이 있지만 솔루션 중 일부가 나를 위해 작동하지 않는다는 것을 알고 있습니다. 대부분은 내 것이있는 / spec / features에없는 사양을 포함합니다." 이 단락은 특히 링크 된 질문을 참조합니다. 이 질문은 투표 수가 높을뿐만 아니라 연결된 질문에 게시 된 가장 많이 득표 한 답변 (솔루션 아님)과 다른 솔루션도 함께 제공됩니다.
lightswitch05 dec.

답변:


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
이것은 나를 위해 일했습니다. 다른 프로젝트에서는이 작업을 수행 할 필요가 없었습니다. 어떤 상황에서 이것이 한 프로젝트에서 필요하지만 다른 프로젝트에서는 필요하지 않을까요? 또한 이것이 정확히 무엇을하고 있습니까?
Peter Berg

1
나를 위해 일했습니다. 대단히 감사합니다!
Marian Zagoruiko

내 파일에는 이미이 문제에 대한 대답으로 확인 된 'spec_helper'가 필요했지만 이것은 나를 위해 일했습니다. 감사!
sixty4bit 2014 년

그것은 나를 위해 작동하지 않습니다 : Capybara정의되지 않은 상수 인 오류 메시지가 나타납니다 . 내 오이 테스트는 카피 바라를 잘 사용하고 있습니다.
digitig 2014 년

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 2014 년

Kocur4d의 대답이 더 정확하더라도 (그리고 rails_helper.rb를 포함하는 것을 잊는 것은 더 일반적인 문제가 아닐지라도) 자신의 대답을 받아들이는 것은 정말 나쁜 방식입니다. 수락 된 답변을 변경해야합니다. 포함하기 전에 구성을 변경하지 않으면 여전히 동일한 오류가 발생합니다.
randmin

36

Capybara 2.0 이후 폴더 사양 / 기능을 사용해야합니다. Capybara 명령은 폴더 사양 / 요청에서 더 이상 작동하지 않습니다.


2
내 질문에서 알 수 있듯이 내 카피 바라 테스트 이미 spec/features. 그러나 그것은 문제가있을 수있는 다른 사람들에게 유효한 포인트입니다.
lightswitch05

디렉토리 mkdir spec/features를 만들고 심볼릭 링크 를 만드는 것이 도움이된다고 생각합니다 ln -s spec/features spec/requests. 이렇게하면 생성 된 모든 테스트가 기능 디렉토리에 배치됩니다.
omarshammas

@ThillaiNarayanan에게 감사드립니다. 이것은 이전 설정 가이드를 따르는 제 문제 였지만 더 최근의
Capybara

5

before블록 에서 모든 설정을 수행하십시오 .

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
이것은 실제로 오류 의 일반적인 원인 입니다. 이 visit기능은 it블록 내에서만 사용할 수 있습니다 . 소스
lightswitch05

4
사실이 아님- before블록의 코드 는 예제 컨텍스트에서 실행되므로 블록 visit에서도 작동 it합니다.
zetetic

2
@ user912563, 궁극적으로 자신의 문제를 해결했기 때문에 내 대답은 다른 무엇보다 스타일 제안이됩니다 ( before블록에 코드를 설정하는 것은 내 사양을 작성하는 방법이며 오류없이 작동합니다 ;-)). 자신의 답변을 받아들이는 것이 공정합니다.
Paul Fioravanti 2013 년

@zetetic과 @ Paul-Firavanti에게 감사드립니다-나는 before여전히 it맥락 안에 있다는 것을 몰랐습니다 . 로그인 훨씬 청소기 필요 내 다른 시험 할 것이다이 사용
lightswitch05

이것은 내가 멍청한 사람이고 그것에 포장 된 시험이 없었기 때문에 나를 도왔다.
Danny

3

나도이 문제가 있었는데

내 기능 상단에 require '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

해당 구성 줄을 추가하면 저에게 효과적이었습니다. 내 사양 파일 중 하나가 아닌 다른 사양 파일에 오류가되었고, 모두 같은 아기 capy 방법이라고 (모두 필요 rails_helper) 때문에 이상하다
조나단 Tuzman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.