ruby-on-rails - #<Class :XYZ> (NoMethodError) [rspec] 的未定义方法 'visit'

标签 ruby-on-rails ruby rspec capybara

当我尝试运行 rspec 测试时出现以下错误:

/srv/offerme/spec/requests/static_pages_spec.rb:13: undefined method `visit' for #<Class:0xb3436684> (NoMethodError)
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:238:in `module_eval'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:238:in `subclass'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:224:in `describe'
from /srv/offerme/spec/requests/static_pages_spec.rb:12
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:238:in `module_eval'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:238:in `subclass'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:224:in `describe'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/dsl.rb:18:in `describe'
from /srv/offerme/spec/requests/static_pages_spec.rb:3
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load_spec_files'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `map'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load_spec_files'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:22:in `run'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:69:in `run'
from /var/lib/gems/1.8/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:8:in `autorun'
from /usr/local/bin/rspec:19

我收到此错误的文件如下所示 (spec/requests/static_pages_spec.rb):

require 'spec_helper'

describe "StaticPages" do
include Capybara::DSL
  describe "GET /static_pages" do
    it "works! (now write some real specs)" do
      # Run the generator again with the --webrat flag if you want to use webrat methods/matchers
      get static_pages_index_path
      response.status.should be(200)
    end 
  end 
  describe "Home page" do
    visit 'static_pages/home'
    page.should have_content('OfferMe')
  end 

end

我的 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'
require 'capybara/rspec'

# 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|
  # ## Mock Framework
  #
  # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

  # If true, the base class of anonymous controllers will be inferred
  # automatically. This will be the default behavior in future versions of
  # rspec-rails.
  config.infer_base_class_for_anonymous_controllers = false

  # Run specs in random order to surface order dependencies. If you find an
  # order dependency and want to debug it, you can fix the order by providing
  # the seed, which is printed after each run.
  #     --seed 1234
  config.order = "random"
  config.include Capybara::DSL
end
module ::RSpec::Core
class ExampleGroup
include Capybara::DSL
include Capybara::RSpecMatchers
end
end

最后,我的 Gemfile 看起来像这样:

source 'https://rubygems.org'

gem 'rails', '3.2.7'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

group :development, :test do
  gem 'sqlite3'
  gem 'rspec-rails'
end

group :test do
  gem 'capybara'
end

gem 'json'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.4'
  gem 'coffee-rails', '~> 3.2.2'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
  gem 'twitter-bootstrap-rails'
end

gem 'jquery-rails'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# To use Jbuilder templates for JSON
# gem 'jbuilder'

# Use unicorn as the app server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug'

gem 'therubyracer', '0.10.1'
gem 'libv8'
gem 'webrat'

我看过这个 GitHub issue并尝试了一些解决方法,并查看了与类似问题有关的其他一些 StackOverflow 问题(这就是为什么某些代码看起来多余/hacky 的原因)。但是,它们都还没有起作用。请帮忙!

最佳答案

更新:

问题是您在 it block 之外调用 visit,此处:

describe "Home page" do
  visit 'static_pages/home'
  page.should have_content('OfferMe')
end

将这些中间行包裹在 it block 中:

describe "Home page" do
  it "has a homepage" do
    visit 'static_pages/home'
    page.should have_content('OfferMe')
  end
end

这应该有效。

原始答案:

我可能是错的,但我相信您必须在 Gemfile 的测试和开发部分都包含 capybara 。

尝试将 Gemfile 的该部分更改为:

group :development, :test do
  gem 'sqlite3'
  gem 'rspec-rails'
  gem 'capybara'
end

关于ruby-on-rails - #<Class :XYZ> (NoMethodError) [rspec] 的未定义方法 'visit',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911408/

相关文章:

ruby - 在 Ruby 中使用带有参数的 procs/lambdas

ruby - 处理 Node.js 中子 shell 的输出

ruby-on-rails - Rails 3 和 rspec 和 i18n - Controller 的正确测试不起作用(失败)

ruby-on-rails - 如何使用多个子查询编写 Rails 查找器

ruby-on-rails - Rails 服务器仍在新打开的 docker 容器中运行

sql - sql注入(inject)的Rails brakeman警告

ruby-on-rails - 使用 rspec 测试具有子域约束的​​路由

javascript - rails : Google Chart only loads after reloaded

ruby-on-rails - 按 current_user 计算的所有交易的总和

ruby-on-rails - 预期 #count 已更改为 1,但未获得 block