2011-12-14 5 views
40

Итак, Rails 3.1 поставляется с малоизвестным удобным генератором «rails g plugin new», который дает вам скелет, подходящий для плагина gem gem. [http://guides.rubyonrails.org/plugins.html#or-generate-a-gemified-plugin]Rails 3.1 plugem gem, приложение для тестирования припасов, rspec

Одна из полезных вещей, которые это делает, - это удобно настроить для тестирования с помощью Test :: Unit. Это дает вам базовое фиктивное приложение Rails, которое ваши тесты могут выполнять в контексте, для проверки поведения «engine», которое работает только в копии приложения Rails. (он помещает его ./test/dummy). Но ваши тесты все еще находятся в my_gem/test, тесты не живут в фиктивном приложении. И там есть my_gem/test/test_helper.rb, написанный так, что тесты будут выполняться в контексте фиктивного приложения, загруженного в ../dummy/config/environment.

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

Но мой вопрос: кто-нибудь понял, как это сделать с помощью rspec? Я попытался следовать тем же принципам DIY, чтобы настроить такие вещи для rspec в gim-плагине rails, но я сталкиваюсь с различными запутанными блокпостами, и надеюсь, что кто-то еще это выяснил (или был бы заинтересован в том, чтобы понять это для остальных из нас, хех).

ответ

93

Создать плагин без тест-блока и указать путь для фиктивного приложения:

rails plugin new foobar --skip-test-unit --dummy-path=spec/dummy 

Добавить RSpec-рельсы как зависимость развития для gemspec файла (foobar.gemspec):

Gem::Specification.new do |s| 
    . 
    . 
    . 
    s.add_development_dependency "rspec-rails" 
end 

Run bundle install

Создайте символическую ссылку из фиктивного приложения в каталог спецификации плагина и запустите генератор установки Rspec:

cd spec/dummy 
ln -s ../../spec 
rails generate rspec:install 
cd - 

Теперь редактировать spec/spec_helper.rb (или spec/rails_helper.rb в рельсах 4+, не уверен в более старых версиях), изменяя эту строку (строка 3):

require File.expand_path("../../config/environment", __FILE__) 

Для этого:

require File.expand_path("../dummy/config/environment", __FILE__) 

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

bundle exec rspec spec 

Я писал об этом более подробно, показывая, как также настроить капибары, Spork и охранник в рельсах плагин с фиктивным приложением:

https://web.archive.org/web/20130125091106/http://namick.tumblr.com/post/17663752365/how-to-create-a-gemified-plugin-with-rails-3-2-rspec

+5

Для меня строка: 'require File.expand_path (« ../../ config/environment », __FILE __)' был расположен по адресу 'spec/rails_helper.rb' вместо 'spec/spec_helper.rb'. Это связано с изменением Rspec? – J3RN

+0

Если вы сохраните фиктивную папку внутри spec /, то rspec найдет ваши файлы спецификаций два раза. Первый раз для gem, второй раз для приложения rails, так как patter будет соответствовать всем файлам spec, если они находятся под символической ссылкой или нет. [--exclude-pattern] (https://relishapp.com/rspec/rspec-core/v/3-3/docs/configuration/exclude-pattern), похоже, работает только вместе с --pattern. 'config.pattern << ',! Spec/dummy'' и, похоже, не работает Единственное решение, которое, кажется, исправляет этот случай, состоит в том, чтобы иметь папку-заглушку вне папки спецификации – Max

+0

Ссылка на tumblr статья на самом деле сломана ... @ nathan-amick вы загрузили ее в другое место? – opsidao

20

Просто запустите rails plugin new <gemname>, а затем добавьте rspec в качестве development_dependency в файл gemspec и установите его rspec --init.

Теперь переместите фиктивную подпапку из test в spec и добавить их в spec_helper:

ENV["RAILS_ENV"] = "test" 

require File.expand_path("../dummy/config/environment.rb", __FILE__) 
require "rails/test_help" 
require '<gemname>' 

Rails.backtrace_cleaner.remove_silencers! 

как в test_helper!

+1

+1 для RSpec --init – fotanus

+3

Это очень сработало для меня, гораздо проще, чем другой ответ –