Как разработать движок Rails3 для реального приложения, используя RSpec? - PullRequest
4 голосов
/ 05 июля 2011

Много написано о разработке движка и использовании фиктивного приложения для тестирования.

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

Отображения данных между старыми унаследованными таблицами и новой схемой являются сложными, и мы хотим использовать TDD (используя rspec) механизм.

  • Я следовал Книга Хосе Валима "Создание рельсовых аппликаций" и использую enginex gem .
  • Я заменил /spec/dummy_app подмодулем git, указывающим на настоящее приложение Rails 3.
  • У меня проблемы с загрузкой моделей из движка (неопределенные ошибки символов), поскольку Gemfile реального приложения не указывает на движок, и я также не могу изменить config/application.rb, чтобы потребовать движок (который это то, что делает фиктивное приложение, как объяснено на страницах 15-16 книги).
  • Я включаю папку lib движка в путь загрузки $: в spec_helper и пути доступны.
  • Помещение require в spec_helper.rb не решило проблему.
  • Мне интересно, есть ли внутренний Rails API (или хитроумный патч обезьяны), чтобы подключиться к последовательности загрузки реального приложения и потребовать движок, без необходимости изменять код реального приложения (как в подмодуле ).
  • Еще одна проблема, в которой я не совсем уверен, заключается в том, что у меня есть 2 Gem-файла (один в движке и один в приложении), и когда двигатель активен, они оба должны использоваться.

Мысли

1 Ответ

8 голосов
/ 06 июля 2011

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

Для простоты я буду называть название моего драгоценного камня как "my_gem"и" MyGem ":

В файле engine.rb я добавил:

require 'my_gem'
require 'rails'

Это исправило ошибки типа:

my_gem/lib/my_gem/engine.rb:2: uninitialized constant MyGem::Rails (NameError)

В spec_helper.rb Я добавил прямо вверху:

require 'bundler/setup'
require 'my_gem'

Это сделано для того, чтобы убедиться, что Bundler инициализируется сразу, а не через приложение.Таким образом, я могу загрузить MyGem здесь, и он будет подключен к последовательности инициализации приложения.Это исправляет NameError исключения для классов моделей движка.

Это оставляет вопрос о том, что Gemfile использовать.Проблема в том, что у моего приложения есть собственный гемфайл, а гем / движок нуждаются в отдельных зависимостях в своем собственном Gemfile.

Я не смог найти API для Bundler для передачи ему двух Gemfile,на самом деле Бандлер, похоже, строится вокруг предположения об одном авторитетном Gemfile.Так что я генерирую один в spec_helper.Я беру гемфайл приложения и добавляю gemspec, который указывает на зависимость гема в формате GemSpec.(Кстати, намек на gemspec отсутствует в книге Хосе Валима).

Я не знаю, есть ли лучший способ, чем объединение файлов во время запуска теста.Если вы знаете об этом, пожалуйста, ответьте.

Полезные ресурсы:

...