Как посеять Test db только один раз в Rails? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть большой словарь из 180 000 слов, который необходимо загрузить в базу данных, чтобы запустить мое приложение, и было бы полезно проверить его. К сожалению, для заполнения базы данных требуется около 30 минут. Есть ли какой-нибудь способ запустить базу данных только один раз или даже заполнить только одну таблицу базы данных и разрешить обновление других таблиц при каждом запуске?

РЕДАКТИРОВАТЬ: В итоге я использовал activerecord-import значительно ускорить процесс посева. Теперь это занимает 16 секунд, а не полчаса. Я также заметил, что в моем файле /spec/rails_helper.rb было следующее:

  config.before(:suite) do
     Rails.application.load_seed # loading seeds
  end

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

По какой-то причине я неправильно подумал, что rspe c просто посеян по умолчанию, что не так.

Ответы [ 2 ]

5 голосов
/ 06 марта 2020

Вы можете повысить эффективность посева с помощью новых направляющих 6 insert_all. Это создает несколько записей с одним insert и не создает экземпляры моделей. OTOH это не делает никакой проверки, поэтому будьте осторожны.

DictionaryWords.insert_all([
  { word: "foo" },
  { word: "bar" },
])

В качестве альтернативы используйте activerecord-import .


Но лучше не делать Всего 180 000 слов.

Проблема с семенами и приспособлениями в том, что они «один размер подходит всем». Они должны охватывать все возможные ситуации для разработчиков и тестирования. Они agile, одно изменение в семени может таинственным образом нарушить многие тесты, которые делали предположения о приборах. Семена будут сдуты, если вам потребуется сбросить ваши базы данных.

Вместо этого используйте factory и создайте то, что вам нужно, когда вам это нужно. Используйте такую ​​библиотеку, как Faker для создания поддельных, но действительных данных.

Например ...

# Assuming you have classes called Dictionary and DictionaryWord
factory :dictionary do
end

factory :dictionary_word do
  dictionary
  word { Faker::Lorem.unique.word }
end

Затем в ваших тестах создайте слова, которые вам нужны. Здесь я использую RSpe c.

let(:dictionary) { create(:dictionary) }
let!(:words) { create_list(:dictionary_word, 3, dictionary: dictionary) }

context 'when the word is in the dictionary' do
  let(:word) { words.sample }

  it 'finds the word' do
    expect( dictionary.exists?(word) ).to be_truthy
  end
end

context 'when the word is not in the dictionary' do
  let(:word) { "septemburary" }

  it 'does not find the word' do
    expect( dictionary.exists?(word) ).to be_falsey
  end
end

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

[1] pry(main)> FactoryBot.create_list(:dictionary_words, 100)

Это не особенно эффективно, но вам, вероятно, не нужно 180 000 слов.


0 голосов
/ 06 марта 2020

Я думаю, ты можешь бежать только один раз.

  1. при первом запуске seed для теста env

    RAILS_ENV = тестовые рельсы db: seed

  2. Теперь запустите RSpe c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...