Capybara: undefined метод 'visit'

При запуске моих спецификаций с rspec и capybara он не может найти способ посещения capybara. Есть ли еще один шаг инициализации, который мне нужно сделать?

$bundle exec rspec spec
/home/brian/projects/expense_track/expense_track/spec/requests/homepage_spec.rb:6:in `block (2 levels) in <top (required)>': undefined method `visit' for #<Class:0xb6572b8> (NoMethodError)

Gemfile:

group :test, :development do
  gem "rspec-rails"
  gem "capybara"
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 'capybara/rspec'
require 'rspec/autorun'

homepage_spec.rb:

require 'spec_helper'

describe "The home page" do

  context "home page exists" do
    visit "/"
    page.should have_content("elephants")
  end
end

Ответ 1

Просто столкнулся с этой проблемой.

Итак, причина этого в том, что в Capybara произошло несколько недокументированных изменений. Capybara теперь делает предположение, что все, что его использует, должно быть в папке spec/features, и оно сделает правильные предположения. Все, что осталось в папке spec/requests, больше не будет работать. Хотя есть обходные пути.

Для контекстного блока вы можете добавить параметр :type => :feature, и это устранит эту проблему или вы можете изменить имя метода describe в начале спецификации на feature, и это также должно изменить его.

Они объявили об этом изменении в своей группе Google: https://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/5KfxezI-U0Q

Примечательно, что мы изменили тип: Capybara предполагает, что ваши спецификации запускаются в RSpec для: функции (ранее это было: запрос). Последняя версия спецификации/функций. В качестве альтернативы вы можете использовать Capybara Feature DSL (функция вместо описания), которая должна работать без дополнительной настройки. Если вы видите ошибки, такие как метод undefined, то вы, вероятно, сталкиваетесь с этой проблемой. Если вы включаете модули в: спецификации запросов, вам, вероятно, придется изменить это на: функцию.

Это было обсуждено в проблеме github: https://github.com/jnicklas/capybara/issues/814

Ответ 2

Несколько вещей, чтобы отметить здесь:

  • Изменения в Capybara 2.0.x описаны здесь https://github.com/rspec/rspec-rails/blob/master/Capybara.md. В структуре каталога спецификаций есть изменения: spec/features, spec/controllers, spec/views, spec/helpers, spec/mailers.
  • загружать Capybara dsl явно внутри вашего spec_helper


       require 'capybara/rails'
       require 'capybara/rspec'
       include Capybara::DSL

Ответ 3

Это сработало для меня.

require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rspec'
require 'capybara/rails'

RSpec.configure do |config|
  config.include Capybara::DSL, :type => :request
end

Это позволяет использовать помощников Capybara внутри spec/запросов.

Ответ 4

Поскольку RSpec.configure не включает capybara DSL в spec_helper.rb

Это уродливое решение, но вы можете добавить его в свой spec_helper.rb.

module ::RSpec::Core
  class ExampleGroup
    include Capybara::DSL
    include Capybara::RSpecMatchers
  end
end 

Проблема git для этого:

https://github.com/rspec/rspec-rails/issues/503

Ответ 5

К сожалению, это обходное решение для меня не делает. Я все еще получаю

NoMethodError:
   undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1:0x007fbfeb535298>

Репо открыто: https://github.com/ikusei/Goldencobra_Newsletter Вам нужно посмотреть на ветку "28817499-subscribe"

edit: Если я включил Capybara:: DSL внутри моего блока описания, он работает.

, но в том числе Capybara:: DSL в глобальной области не рекомендуется!

Потому что я не знаю хороший способ.

Ответ 7

Для rspec 3 и рельсов убедитесь, что вы используете require "rails_helper" вместо require "spec_helper".

В противном случае просмотрите последние изменения rspec 3 и rspec-rails и Capybara 2.0.x.