Переход с Webrat на Capybara … безуспешно

#ruby-on-rails #rspec #capybara

#ruby-on-rails #rspec #capybara

Вопрос:

Надеюсь, кто-нибудь увидит, что я упустил из виду…

Я пытаюсь заставить Capybara работать в небольшом существующем приложении … и у меня ничего не получается.

Gemfile:

   group :development, :test do
    gem 'rspec-rails'
    # gem 'webrat'
    gem 'capybara', :git => 'git://github.com/jnicklas/capybara.git'
  end
  ...
  

Похожие спецификации в двух местах выходят из строя по разным причинам. Не уверен, почему?

спецификация /контроллеры/pages_controller_spec.rb:

 require 'spec_helper'

describe PagesController do

  describe "GET 'about'" do
    it "should be successful" do
      # get 'about'                         #worked w/ webrat
      # response.should be_success          #worked w/ webrat
      visit pages_about_path
      # page.should have_content('About Us') 
      page.html.should match(/About/i)
    end

    it "should have title" do
      # get 'about'                         #webrat
      # response.should have_selector("title", :content => "About Us") #webrat
      visit pages_about_path                
      page.should have_selector("title")    
    end
  end  
end
  

Сбои:
(может быть, загружается какая-то общая страница, как doctype в браузере "<!DOCTYPE html>" )

   1) PagesController GET 'about' should be successful
     Failure/Error: page.html.should match(/About/i)
       expected "<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">nn" to match /About/i
     # ./spec/controllers/pages_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

  2) PagesController GET 'about' should have the right title
     Failure/Error: page.should have_selector("title") 
       expected css "title" to return something
     # ./spec/controllers/pages_controller_spec.rb:20:in `block (3 levels) in <top (required)>'
  

спецификация /просмотры / страницы/about.html.haml_spec.rb:

 require 'spec_helper'

describe "pages/about.html.haml" do
  it "renders attributes in <p>" do
    # render #webrat
    # rendered.should match(/About/) #webrat
    visit pages_about_path
    page.should have_content("About Us")
  end

  it "should have the right heading" do  
    # render #webrat
    # rendered.should have_selector("h2", :content => "About Us") #webrat
    visit pages_about_path
    page.should have_selector("h2")
  end
end
  

Сбои:

   1) pages/about.html.haml renders attributes in <p>
     Failure/Error: visit pages_about_path
     NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x00000101dc2970>
     # ./spec/views/pages/about.html.haml_spec.rb:8:in `block (2 levels) in <top (required)>'

  2) pages/about.html.haml should have the right heading
     Failure/Error: visit pages_about_path
     NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x000001034b1d98>
     # ./spec/views/pages/about.html.haml_spec.rb:16:in `block (2 levels) in <top (required)>'
  

Комментарии:

1. Пожалуйста, отметьте nigelr (или того, кто, по вашему мнению, этого заслуживает) в качестве принятого ответа для других, у кого может возникнуть эта проблема, и в качестве обычной вежливости.

Ответ №1:

Только что столкнулся с той же проблемой и обнаружил, что capybara нуждается:

 response.body.should have_selector("title")
  

webrat не нуждается в .Тело

кроме того, убедитесь, что вы визуализируете представления, например:.

 describe PagesController do
  render_views
  

Комментарии:

1. Это ответ. Кроме того, если вы переходите из railstutorial.org Я полагаю, вам также необходимо изменить :content => «что угодно» на :title => «что угодно». В противном случае он проходит независимо от содержимого.

2. Я думаю, yakiimo означает, что have_selector("title", :content => "Home") становится have_selector("title", :text => "Home") . Я также обнаружил, что have_selector("a", :href => "/users?page=2", :content => "Next") изменения в have_link("Next", :href => "/users?page=2") . Я нахожу полезными примеры «до» и «после» в этом сообщении в блоге: Переход с Webrat на Capybara .

Ответ №2:

Вы должны включить capybara DSL в свой тестовый файл :

 require 'spec_helper'

    describe PagesController do

    include Capybara::DSL

      describe "GET 'about'" do
        it "should be successful" do 
      ...
  

Ответ №3:

Это не решит всех ваших проблем, но вместо:

 page.html.should match(/About/i)
  

попробуйте:

 page.should match(/About/i)
  

(возможно, вам даже не понадобится страница).

Кроме того, убедитесь, что Capybara настроен на использование CSS-запросов в env.rb (по умолчанию используется XPath).

Комментарии:

1. Удаление ‘html.’ не сработало. Кроме того, в Capybara’s read me говорится: «Capybara не пытается угадать, какой тип селектора вы собираетесь ему предоставить, и всегда будет использовать CSS по умолчанию . Если вы хотите использовать XPath, вам нужно будет сделать … » Видя ошибку » неопределенный метод `visit’ » заставляет меня думать, что Capybara неправильно установлена или ссылается на нее … но не уверен, как подтвердить !?!

2. Хм, генерируемый env.rb Cucumber говорит «Capybara по умолчанию использует селекторы XPath, а не CSS3 по умолчанию Webrat». Но да, похоже, что он не поддерживает Capybara. Вы пробовали запускать через Bundler? пакет exec cucumber

3. не использую Cucumber … на самом деле не хочу … возможно, проблема в этом?

Ответ №4:

Убедитесь, что в вашем spec_helper.rb файле вверху указано следующее:

 ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rspec'
  

У меня была похожая проблема, как у вас (т. Е. undefined method 'visit' ), и добавление этих строк решило проблему.