2013-05-21 3 views
3

Я использую RSpec для тестирования некоторых моделей двигателей.Являются ли * все * спецификациями для двигателя, который, как ожидается, будет жить в фиктивном приложении Rails?

Мое предпочтение было бы проверить части, которые не зависят от приложения (заглушки) за пределами приложения. Я бы предпочел, чтобы тесты, отличные от приложения, находились на верхнем уровне и не скрывались в spec/dummy/spec.

Проблема заключается в том, что инициализаторы двигателя по умолчанию (AFAICT) не запускаются, если двигатель не установлен.

Должен ли я просто идти с тем, что, как представляется, следует ожидать, то есть, поставить все мои функции в фиктивном приложении и запустить RSpec из каталога манекена приложения, даже если тесты не связаны с приложением в целом ?

Должен ли я запускать инициализаторы из вспомогательного помощника верхнего уровня для спецификаций, отличных от приложения? Или каким-то другим способом?

Если да, есть ли фиктивные последствия для приложения?

+0

https://github.com/apneadiving/Google-Maps-for-Rails/tree/master/spec – apneadiving

+0

@apneadiving Спасибо :) Как насчет инициализаторов? Или я должен переместить их в что-то в 'lib', или ...? То, что у вас здесь, - это более или менее то, что у меня теперь есть дельта инициализаторы. –

+1

ok Я вижу, если инициализаторы устанавливают необходимый контекст, вы можете потребовать их в некоторых спецификациях. Разве этого недостаточно? – apneadiving

ответ

2

Если у вас есть фиктивное приложение, вам необязательно иметь свои спецификации в структуре dummy app dir.

Ниже приведена упрощенная версия того, что использует permitters v0.0.1.

В spec/spec_helper.rb:

ENV['RAILS_ENV'] = 'test' 
app_path = File.expand_path("../dummy", __FILE__) 
$LOAD_PATH.unshift(app_path) unless $LOAD_PATH.include?(app_path) 

# if require rails, get uninitialized constant ActionView::Template::Handlers::ERB::ENCODING_FLAG (NameError) 
require 'rails/all' 
require 'config/environment' 
require 'db/schema' 
require 'rails/test_help' 
require 'rspec/rails' 

# rspec config, etc. 

Кроме того, я хочу сказать, что все модификации, которые я сделал в фиктивном приложении в spec/dummy были либо позволить ему работать в различных версиях Rails (3.1. x, 3.2.x и 4.0.x) или потому, что я настраивал вещи для драгоценного камня в фиктивном приложении.

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

Если вы хотите не загружать среду Rails для определенного набора спецификаций (т. Е. Не загружать Rails для некоторых спецификаций_), вы можете это сделать. Вы можете просто установить env var в определении задачи в Rakefile или в командной строки, а затем найдите это в spec_helper.rb, чтобы определить, нужно ли загружать вещи или нет. Тогда у вас могут быть разные задачи Rake, которые порождают новые процессы, которые устанавливают env var или нет, в зависимости от того, нужен ли набор тестов Rails. не обязательно беспокоиться об этом, хотя если бы все предназначалось для запуска в Rails, если вам действительно не нужно его изолировать.

Для получения дополнительной информации о различных способах тестирования с помощью фиктивных приложений вы можете увидеть этот вопрос: Strategies for gem tests to ensure the gem works with Rails 3.x and 4.0.

+0

Речь идет не столько о необходимости «изолировать», а скорее (1) более очевидном месте, чем в подкаталоге, и (2) если спецификации не полагаются на Rails, похоже, они должны быть способны живите на верхнем уровне двигателя, а не похоронены в манекене. Это скорее философский вопрос, чем технический, с некоторыми техническими последствиями. Я проверю ваши ссылки; Благодарю. –

+0

Согласен. Причина, по которой мне нравятся спецификации вне фиктивного приложения, - это (1), я бы хотел рассмотреть фиктивное приложение как среду Rails, а не мой драгоценный камень или мои тесты, и (2) если по какой- d хотел бы использовать тот же набор спецификаций для разных фиктивных приложений (хотя это чище, если вы просто используете условные обозначения в фиктивном приложении), я мог бы легко и (3), как вы сказали, более очевидно, что тесты в спецификации, а не spec/dummy/spec. –

+0

Попробовал немного изменить свой ответ и предоставить некоторый фактический код, а не только ссылку. –