Проблема с капибарой: @request должен быть ActionDispatch :: Request - PullRequest
4 голосов
/ 02 февраля 2012

У меня проблемы с работой Capybara с Rails.Просто тестирую этот интересный тест.Хорошо, в прилагаемом коде есть пара эквивалентных тестов.Первый сделан с использованием musta-context + Test :: Unit, который поставляется с Rails.Второй тест также выполняется с использованием capybara и musta-context.

require 'integration_test_helper'

class UsersTest < ActionDispatch::IntegrationTest
  fixtures :all

  context "signup" do

    context "failure" do

      setup do
      @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" }
      end

      should "not make a new user" do
        assert_no_difference 'User.count' do
          post_via_redirect "users", :user =>@attr  # enviem les dades d'un nou usuari via create (POST /users)
          assert_template 'users/new'     # ens retorna a users/new, que significa que no s'ha creat l'usuari
          assert_select "div#error_explanation" # comprovem que conte missatges d'error
        end
      end

      should "not make a new user (capybara)" do
        assert_no_difference 'User.count' do
          visit '/signup'
          fill_in 'Name', :with => @attr[:name]
          fill_in 'Email', :with => @attr[:email]
          fill_in 'Password', :with => @attr[:password]
          fill_in 'Confirmation', :with => @attr[:password_confirmation]
          click_button 'Sign Up!'
          assert_template 'users/new'     # ens retorna a users/new, que significa que no s'ha creat l'usuari
          assert_select "div#error_explanation" # comprovem que conte missatges d'error
        end
      end
    end
end

Пока первый тест работает нормально, один из capybara выдает следующее сообщение об ошибке:

================================================================================
Error:
test: signup failure should not make a new user (capybara). (UsersTest):
ArgumentError: @request must be an ActionDispatch::Request
    test/integration/users_test.rb:30:in `block (4 levels) in <class:UsersTest>'
    test/integration/users_test.rb:23:in `block (3 levels) in <class:UsersTest>'
================================================================================

требуемый * integra_test_helperФайл .rb * - это накопитель всех предлагаемых решений, которые я нашел в поиске, и которые не работают для меня.

require 'test_helper'
require 'capybara/rails'
require 'database_cleaner'

# Transactional fixtures do not work with Selenium tests, because Capybara
# uses a separate server thread, which the transactions would be hidden
# from. We hence use DatabaseCleaner to truncate our test database.
DatabaseCleaner.strategy = :truncation

class ActionDispatch::IntegrationTest
  # Make the Capybara DSL available in all integration tests
  include Capybara::DSL

  # Stop ActiveRecord from wrapping tests in transactions
  self.use_transactional_fixtures = false

  teardown do
    DatabaseCleaner.clean       # Truncate the database
    Capybara.reset_sessions!    # Forget the (simulated) browser state
    Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver
  end
end

Есть ли у кого-нибудь решение?Стоит ли попробовать другую работу по интеграции, например, webrat?

Моя настройка:

marcel@pua:~/Desenvolupament/Rails3Examples/ror_tutorial$ rake about
About your application's environment
Ruby version              1.9.2 (x86_64-linux)
RubyGems version          1.8.15
Rack version              1.3
Rails version             3.1.3
JavaScript Runtime        therubyracer (V8)
Active Record version     3.1.3
Action Pack version       3.1.3
Active Resource version   3.1.3
Action Mailer version     3.1.3
Active Support version    3.1.3
Middleware                ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002b9bac0>, Rack::Runtime, Rack::MethodOverride, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::RemoteIp, Rack::Sendfile, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, ActionDispatch::Head, Rack::ConditionalGet, Rack::ETag, ActionDispatch::BestStandardsSupport
Application root          /mnt/dropbox/Dropbox/DESENVOLUPAMENT/Rails3Examples/ror_tutorial
Environment               development
Database adapter          sqlite3
Database schema version   20120127011330

Также

shoulda-context (1.0.0)
capybara (1.1.2)

Спасибо

Ответы [ 3 ]

11 голосов
/ 02 февраля 2012

Вы смешиваете типы тестов и пытаетесь утвердить шаблон в тесте неправильного типа.Вы должны утверждать шаблоны только в своих функциональных тестах, где вы просто непосредственно тестируете контроллер и фактически не имитируете взаимодействие с пользователем.

Капибара предназначена специально для интеграционного тестирования, которое, по сути, выполняет тесты с точки зренияконечного пользователя, взаимодействующего с браузером.В этих тестах вы не должны утверждать шаблоны, потому что конечный пользователь не может видеть это глубоко в вашем приложении.Вместо этого вам следует проверить, что действие приводит вас к правильному пути.

current_path.should == new_user_path
page.should have_selector('div#error_explanation')

См. Раздел «DSL» в README Капибары о git: https://github.com/jnicklas/capybara

Официальное объяснениеВаша проблема: https://github.com/jnicklas/capybara/issues/240

1 голос
/ 18 июня 2012

Для полноты, потому что я буду знать, что я буду возвращаться к этой ссылке снова и снова:

Те, кто использует тестовый блок и капибару, это тоже хороший учебник: от techiferous .

Обратите внимание на использование assert page.has_content?("something")

Это хорошо для использования, а также assert_equal some_path, current_path для тестирования маршрутов.

Является ли это наиболее полным, донне знаю, но вам не нужно гораздо больше.

0 голосов
/ 02 февраля 2012

Спасибо за ваши советы @Ryan. Я пытался выяснить, как перевести некоторые тестовые примеры интеграции RSpec из http://ruby.railstutorial.org/chapters/sign-up#sec:rspec_integration_tests в Test :: Unit + Capybara. Исходный тест интеграции RSpec был

it "should not make a new user" do
  lambda do
      visit signup_path
      fill_in "Name",         :with => ""
      fill_in "Email",        :with => ""
      fill_in "Password",     :with => ""
      fill_in "Confirmation", :with => ""
      click_button
      response.should render_template('users/new')
      response.should have_selector("div#error_explanation")
    end.should_not change(User, :count)
  end
end

Итак, после вашего ответа я предлагаю, чтобы исходный пример не содержал response.should render_template('users/new')

...