在 rails 中使用 RSpec 和 Capybara 时未定义的方法“visit" [英] undefined method `visit' when using RSpec and Capybara in rails

查看:15
本文介绍了在 rails 中使用 RSpec 和 Capybara 时未定义的方法“visit"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法让水豚使用 rspec.它给了我这个错误:

I can't get capybara working with rspec. It gives me this error:

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

我知道有很多关于此的帖子,但没有一个解决方案对我有用.它们中的大多数都涉及不在/spec/features 中的规范 - 我的在其中.

I know there are lots of posts about this but non of the solutions are working for me. Most of them involve the specs not being in /spec/features - which mine is in.

首先是错误:

$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' 并且它一直给我一个错误未定义的局部变量或方法 'new_sessions_path'.我知道它是有效的,因为:

I think its important to note that at first I was using the URL Helper 'new_sessions_path' and it kept giving me an error undefined local variable or method 'new_sessions_path'. I know it is valid because:

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

My 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 中:

spec_helper.rb inside of 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:

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 => 的情况下定义上面的测试.:功能.无论哪种方式都没有区别.知道我接下来应该尝试什么吗?

I've tried defining the test above both with and without :type => :feature. It makes no difference either way. Any ideas what I should try next?

推荐答案

在我的功能顶部添加 require 'rails_helper' 最终解决了我的问题:

Adding require 'rails_helper' at the top of my feature ended up fixing my problem:

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 和水豚的例子都没有那个要求,但是哦.问题解决了.

This seems odd to me since every example I've seen for rspec and capybara didn't have that require, but oh well. Problem solved.

require 'spec_helper' 被旧版本的 RSpec 使用.更好的答案是 require 'rails_helper'.

require 'spec_helper' is used by older versions of RSpec. The better answer would be require 'rails_helper'.

这篇关于在 rails 中使用 RSpec 和 Capybara 时未定义的方法“visit"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆