Отделить тестовую базу данных приложения Sinatra от базы данных разработки? - PullRequest
5 голосов
/ 21 февраля 2012

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

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

Например, я хочу создать несколько объектов базы данных перед запуском остальной части спецификации ...

before(:all) {
  Region.new(:country => "Canada", :country_code => "CA").save
  ProductLine.new(:reference => "Molders").save
  Product.new(:name => "The Black Molder").save
  Cart.new(:price => 25.95).save
}

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

Почему вместо этого не создается тестовая база данных? Как заставить тестовую базу данных работать должным образом?

Это похоже на эту проблему здесь , за исключением Sinatra вместо Rails.

Если это поможет, мой код можно увидеть здесь .

1 Ответ

16 голосов
/ 21 февраля 2012

В spec_helper.rb файле вам требуется my_app.rb файл, который, в свою очередь, требует db.rb для настройки базы данных, но это происходит за до , когда вы вызываете set :environment, :test, поэтому блок configure :testне запускается (среда является разработкой по умолчанию на этом этапе).

Конечно, вы не можете вызвать set environment :test, пока не потребуете Sinatra, но вы можете установить переменную окружения RACK_ENV, котораяСинатра проверяет при настройке своей среды.

Поэтому, чтобы убедиться, что вы работаете в тестовой среде, добавьте это в начало spec_helper.rb (или где-то еще в начале ваших тестов, но прежде чем вам потребуетсяСинатра):

ENV['RACK_ENV'] = 'test'

Затем вы можете удалить строку set :environment, :test, так как она теперь избыточна.

Это похоже на другой вопрос, на который вы ссылаетесь, но вместо этого в стойках используются RACK_ENVRAILS_ENV.

...