Предотвращение проверки Rails при удалении данных семян
Я использую seeds.rb для заполнения некоторых ссылочных данных модели модели:
State.create :name => 'Alabama', :abbreviation => 'AL'
State.create :name => 'Alaska', :abbreviation => 'AK'
# ...
Несмотря на то, что я не использую государственные устройства (так как это начальные данные для начала, я думаю, что это не было бы СУХОЙ, чтобы дублировать это исключительно для тестов), структура тестирования Rails, кажется, удаляет все данные семенного состояния во время тестирование. (Я отбрасываю, воссоздаю, переношу и повторно загружаю тестовый db, и подтвердил, что данные перед запуском unit test.)
Результатом является это утверждение, преуспевающее в seeds.rb, но не выполненное в однострочном тесте:
assert_equal 51, State.all.size
1) Failure:
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]:
<51> expected but was
<0>.
1 tests, 1 assertions, 1 failures, 0 errors
Я попробовал как явно перечислять негосударственные модели в операторе базового тестового класса, так и переворачивать флаг транзакционных флагов (как и ожидалось, это влияет только на записи, созданные во время теста). Естественно, рассматриваемый тест сам не удаляет эти записи.
Записи состояний всегда удаляются. Есть ли способ сказать Rails просто избавиться от данных семян? Нужно ли дублировать все данные в приборах, чтобы убедиться, что они загружены? Если не считать крупного политического события, я бы ожидал, что данные состояния будут относительно стабильными.
TIA
Ответы
Ответ 1
Тесты удаляют все данные из базы данных и затем загружают ваши приборы (если они есть).
Вам нужно, чтобы ваш тестовый помощник загрузил файл семян до запуска тестов. Есть несколько способов сделать это, проверить мой аналогичный вопрос: Как загрузить db: исходные данные в тестовую базу данных автоматически?
Самый простой способ - это просто добавить
require "#{Rails.root}/db/seeds.rb"
в верхней части вашего файла test_helper.rb(при условии, что вы используете встроенную среду тестирования).
Ответ 2
Функция "семя" не интегрирована в тестовую архитектуру. Тесты строятся вокруг приборов, и каждый раз, когда вы запускаете тестовый набор, Rails загружает данные из светильников и заменяет существующий контент.
Однако наличие базы данных, заполненной вашими данными семян, действительно просто.
В файле test_helper.rb добавьте новый метод установки в базовый класс ActionSupport::TestCase
.
class ActionSupport::TestCase < ...
setup :load_seeds
protected
def load_seeds
load "#{Rails.root}/db/seeds.rb"
end
end
Ответ 3
Я согласен с weppos в том, что касается наилучшего способа сделать это, однако для полноты и для людей, у которых уже есть файлы с креплением, вы можете использовать другой подход и засеять свою базу данных из существующих светильников.
Это достигается тем, что в файле db/seeds.rb выполняется следующее:
RAILS_FIXTURES = "#{Rails.root}/spec/fixtures"
models_loaded_from_fixtures = %w[Modela Modelb Modelc ....]
models_loaded_from_fixtures.each do |model|
Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}")
puts "Loaded #{model.constantize.all.size} #{model.pluralize}"
end
Вы также можете прочитать каталог fixures и создать массив имен файлов для обработки, я выбрал вышеупомянутый процесс, поскольку я хотел бы указать, какой из моих многочисленных существующих светильников я хотел бы засеять DB.
Ответ 4
Я сомневаюсь в необходимости написать такой тест, в первую очередь. Проверяете ли вы, что задача грабли семян работает правильно или вы хотите проверить поведение вашей реализации класса State? Я предполагаю последнее, поэтому я бы написал тесты, которые фокусируются на поведении и использовании Factory Girl (или аналогичных), поскольку вы упоминаете, что вы не используете приборы. Обязательно удалите строку fixtures :all
с test/test_helper.rb
.
Чтобы внедрить задачу в обычный поток текущих тестов, это подход, который всегда работал у меня:
namespace :test do
task :force_environment do
ENV['RAILS_ENV'] = 'test'
RAILS_ENV.replace('test')
end
end
%w(test:units test:functionals test:integration).map do |task_name|
task = Rake::Task[task_name]
task.clear_prerequisites
task.enhance %w(db:test:prepare test:force_environment db:seed)
end
Просто поместите это в файл с именем lib/tasks/testing.rake
, и он будет поднят при следующем запуске rake test
или другой связанной с тестированием задачи.
Ответ 5
У меня была та же проблема, но стандартный ответ не сработал у меня.
В моей проблеме участвовали места в файлах классов, которые выполняли поиск базы данных для констант и named_scopes. Я не мог найти способ загрузки загружаемых данных в нужное время.
Я нашел способ обходить удаление, которое происходило, хотя я удалил файл fixture для отсутствующей таблицы.
RAILS_ENV = test rake db: seed
ruby -Itest test/units/*. rb