Тестирование монтируемого движка Rails 3.1 с помощью Rspec

Я начал создавать движок Rails 3.1, и мне трудно тестировать его с помощью rspec.

Прежде всего, если я запускаю rails g integration_test whatever, он создает обычный интеграционный тест в tests / integration вместо spec / requests (гем rspec-rails установлен и требуется как зависимость разработки в файле gemspec)

Кроме того, когда я запускаю тест спецификации, я получаю сообщение об ошибке, что таблица, соответствующая модели, которую я тестирую, не создана. Я попробовал rake engine_name:install:migrations и запустил rake db:migrate из фиктивного приложения и получил ошибку «таблица уже существует».

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

Я следил за всеми изменениями отсюда http://rubyx.com/2011/03/01/start-your-engines, и я могу протестировать движок вручную, запустив фиктивное приложение через консоль, как показано здесь http://railscasts.com/episodes/277-mountable-engines.

Есть ли способ сделать rspec значением по умолчанию для тестирования движка rails 3.1?


person deb    schedule 17.09.2011    source источник
comment
В rails 3.2 некоторые из этих проблем были решены, но я всегда забываю, как перенести тестовую базу данных. Чтобы выполнить миграцию в тестовой базе данных, запустите rake app:db:test:prepare в каталоге вашего драгоценного камня.   -  person Andrew    schedule 21.03.2013
comment
Я просто без проблем реализовал метод, описанный в этой статье. viget.com/extend/   -  person jspooner    schedule 16.09.2013


Ответы (2)


Я без проблем использую RSpec с движком Rails.

Я создал свой плагин, используя следующие ключи: -T --full --dummy-path = spec / dummy.

  • -T исключает тест / блок
  • --full указывает, что плагин является движком
  • --dummy-path просто для того, чтобы мы не получали тестовый каталог (по умолчанию test / dummy).

Оттуда я использовал spec_helper из статьи "Запустите свои двигатели":

# Configure Rails Envinronment
ENV["RAILS_ENV"] = "test"
require File.expand_path("../dummy/config/environment.rb",  __FILE__)

require 'rspec/rails'

ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[File.join(ENGINE_RAILS_ROOT, "spec/support/**/*.rb")].each {|f| require f }

RSpec.configure do |config|
  config.use_transactional_fixtures = true
end

Для генераторов. Я добавляю блок config.generators в свой файл engine.rb следующим образом:

module MyEngine
  class Engine < Rails::Engine
    config.generators do |g|
      g.test_framework :rspec, :view_specs => false
    end
  end
end

Благодаря этому я могу получить тесты rspec при запуске генератора, такого как генератор модели.

Что касается БД, правильно ли настроен ваш файл database.yml? Вы загрузили тестовую среду, например rake db:test:clone или rake db:migrate RAILS_ENV=test? Я предполагаю, что RSpec не может видеть ваши таблицы, потому что не настроена тестовая база данных.

person dwhite    schedule 19.09.2011
comment
не следует ли мне использовать --mountable вместо --full? - person deb; 21.09.2011
comment
Я следил за изменениями в вашем ответе, но по-прежнему не могу использовать генератор. если я попробую rails g integration_test posts, ничего не произойдет. Может ты что-то упустил? - person deb; 21.09.2011
comment
Я не использую генератор integration_test, поэтому не уверен. Простое указание --full означает, что это стандартный движок без пространства имен и будет генерировать фиктивный проект. Я почти уверен, что вам нужно передать --full для --mountable, чтобы создать фиктивный проект, но, может быть, это изменилось после RC? Что будет, если сделать модель rails g ... или контроллер? - person dwhite; 21.09.2011
comment
Я удалил g.test_framework :rspec из файла engine.rb, и теперь программа интеграции_generator работает. Понятия не имею, почему :) Теперь модель rails g также дает мне тесты rspec. Думаю, разница была в передаче --full при создании плагина - person deb; 21.09.2011
comment
Рад слышать! Я немного удивлен, почему config.generate не работает, именно так я смог настроить то, что было создано. Итак, вы использовали -T --full --mountable --dummy-path = spec / dummy? Если вы хотите, чтобы все было в пространстве имен и отдельно от приложения, вам понадобится переключатель --mountable, в противном случае вы можете просто передать --full самостоятельно. Вы также решили проблемы с тестовой БД? - person dwhite; 21.09.2011
comment
Хорошо, что я получил до сих пор, так это то, что если я передаю оба переключателя, и --mountable, и --full, мне нужно добавить g.test_framework: rspec в engine.rb. Если я использую только --full, мне не нужна эта строка. Если я использую только --mountable, генераторы вообще не получат rspec, с конфигурацией в engine.rb или без нее. - person deb; 21.09.2011
comment
Я все еще работаю над db. Завтра обновлю. Спасибо за помощь, я пометил ваш ответ как правильный. Ваше здоровье! - person deb; 21.09.2011
comment
Если вы используете только --mountable, вы не получите фиктивный проект, не так ли? Вот почему RSpec ничего не генерирует, потому что генерировать не на что :) - person dwhite; 21.09.2011
comment
позвольте нам продолжить это обсуждение в чате - person dwhite; 21.09.2011
comment
Вам нужно добавить g.integration_tool: rspec в engine.rb для интеграционных тестов, чтобы использовать rspec - person Ajay Kumar Guthikonda; 07.02.2012
comment
Согласно руководствам Rails, вы можете использовать оба, --full --mountable. -T и --dummy-path - это то, что мне нужно! Спасибо за это. Вы спасли меня от множества хаков: P - person Theo Scholiadis; 08.06.2012
comment
@dwite Возможно, вы захотите отредактировать свой ответ, включив в него тот факт, что сгенерированные спецификации должны быть заблокированы модулем MyEngine ... end, иначе вы получите неинициализированную постоянную ошибку. - person Theo Scholiadis; 08.06.2012
comment
Строка 2 файла engine.rb должна читать Rails :: Engine, а не Rail :: Engine. - person Andrés Bonilla; 01.10.2012
comment
Вы можете использовать MyEngine.root вместо ENGINE_RAILS_ROOT - person Kris; 19.06.2013

Я искал тот же ответ и нашел драгоценный камень горения *, который обещает настроить полную среду для спецификации Сделайте ваш двигатель более простым. Просто добавь

gem.add_development_dependency 'combustion', '~> 0.3.1'

к вашему драгоценному камню и беги

bundle exec combust

чтобы воспроизвести полное приложение rails в вашем каталоге спецификаций.

* Еще не пробовал ...

person Fabio    schedule 14.03.2012
comment
Спасибо за ссылку - горящие породы. - person Marnen Laibow-Koser; 06.06.2012