[ruby-on-rails] 레일에서 RSpec 및 Capybara를 사용할 때 정의되지 않은 방법 ‘visit’
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
. 어느 쪽이든 차이가 없습니다. 다음에 시도해야 할 아이디어가 있습니까?
답변
추가해보십시오 :
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
답변
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'
.
답변
Capybara 2.0 이후 폴더 사양 / 기능을 사용해야합니다. Capybara 명령은 폴더 사양 / 요청에서 더 이상 작동하지 않습니다.
답변
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
답변
나도이 문제가 있었는데
내 기능 상단에 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