Как использовать FactoryBot с базой данных только для чтения - PullRequest
0 голосов
/ 16 мая 2018

У меня есть 2 приложения Rails. Первый управляет пользовательскими данными. Второй имеет доступ только для чтения к базе данных первого, чтобы получить эти пользовательские данные.

user = FactoryBot.create(:user)
# Test user associations that only exist in the 2nd application

Очевидно, что эта строка не будет выполнена, поскольку пользователь не может быть создан из-за разрешений на уровне базы данных. Моей первой мыслью было бы открыть базу данных _test первой базы данных, чтобы иметь полные разрешения на запись, но это неправильно, поскольку у нее будут другие разрешения, нежели в производственной среде, что может скрывать / вызывать другие проблемы.

Каков наилучший подход для использования FactoryBot для тестирования аспектов второго приложения с использованием фиктивных пользовательских данных из первого?

Обновление

Одна мысль, которую я имел, состояла в том, чтобы предварительно загрузить фиктивную тестовую базу данных и убедиться, что 2-е приложение имеет доступ только для чтения. Тогда мои тесты будут просто запрашивать существующего пользователя (хотя для этого нужно иметь предварительные знания о данных внутри), а не использовать FactoryBot для их создания. Это жизнеспособный подход?

1 Ответ

0 голосов
/ 16 мая 2018

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

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

Быстрый пример:

def fixture_file_path(filename)
  Rails.root.join("spec/fixtures/#{filename}").to_s
end

def read_fixture_file(filename)
  File.read fixture_file_path(filename)
end

let(:fixture)      { read_fixture_file("file.xml") } 

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

.
subject(:service) { described_class.call fixture }

Тогда вы можете пойти оттуда и построить интерактивность, чтобы проверить, как вам нужно.

...