Вопрос или проблема
Я пытаюсь запустить тесты playwright для моего приложения SvelteKit, где я создаю новую базу данных для каждого запуска набора тестов. Я устанавливаю переменные окружения в файле настройки тестов вот так:
import { exec as baseExec } from 'child_process';
import util from 'util';
import { test as setup } from '@playwright/test';
import { uid } from 'uid';
const exec = util.promisify(baseExec);
setup('создать новую базу данных', async ({}) => {
// Vite заменяет точечную нотацию
// https://github.com/vitejs/vite/issues/3176
// eslint-disable-next-line @typescript-eslint/dot-notation
process.env['DATABASE_URL'] = `file:e2e/${uid()}.db`;
await exec('npm run db:push -- --force');
});
Я могу читать process.env в файле завершения, но сами тесты по-прежнему используют URL базы данных, установленный в моем .env файле. Моя база данных настроена так:
import { createClient } from '@libsql/client';
import { drizzle } from 'drizzle-orm/libsql';
import { env } from '$env/dynamic/private';
if (env.DATABASE_URL == null) {
throw new Error('DATABASE_URL не установлена');
}
const client = createClient({ url: env.DATABASE_URL });
export const db = drizzle({ client, casing: 'snake_case' });
Как заставить тесты использовать базу данных, созданную в файле настройки?
Ответ или решение
Как установить переменные окружения в режиме выполнения в SvelteKit
Ваша задача заключается в том, чтобы динамически устанавливать переменные окружения при запуске тестов Playwright для вашего приложения SvelteKit, особенно касаемо переменной DATABASE_URL
, которая должна указывать на базу данных, созданную в процессе настройки.
Проблема
Вы установили переменные окружения в файле настройки тестов, однако ваши тесты продолжают использовать значение переменной DATABASE_URL
, заданное в .env
файле проекта. Это связано с особенностями того, как SvelteKit управляет переменными окружения на этапе сборки и выполнения.
Решение
Для того чтобы обеспечить доступ вашему коду к измененным переменным окружения во время выполнения тестов, вам потребуется специальный подход, так как SvelteKit использует динамические импорты из проекта env
, которые считываются на этапе сборки, а не во время выполнения.
Вот несколько шагов, которые вы можете предпринять для решения этой проблемы:
-
Создание отдельного файла конфигурации:
Создайте файл, который будет заниматься динамическим разрешением переменнойDATABASE_URL
в зависимости от того, установлена ли она в окружении. Это может выглядеть так:// src/lib/databaseConfig.js export function getDatabaseUrl() { if (process.env.DATABASE_URL) { return process.env.DATABASE_URL; } else { throw new Error('DATABASE_URL is not set'); } }
-
Использование пользовательского механизма импорта:
Вместо использования импорта из$env/dynamic/private
, вы можете импортировать свой файл конфигурации и использовать его в своих тестах. Например, измените ваш код для инициализации базы данных таким образом:import { createClient } from '@libsql/client'; import { drizzle } from 'drizzle-orm/libsql'; import { getDatabaseUrl } from '$lib/databaseConfig'; const client = createClient({ url: getDatabaseUrl() }); export const db = drizzle({ client, casing: 'snake_case' });
-
Перезапуск вашего приложения при изменении окружения:
Возможно, потребуется настроить ваше приложение SvelteKit так, чтобы оно автоматически перезапускалось, если окружение меняется. Вы можете использовать такие инструменты, какnodemon
, который позволит перезапустить приложение при изменениях в коде или конфигурации. -
Проверка значений во время выполнения:
Убедитесь, чтоprocess.env.DATABASE_URL
действительно изменяется перед запуском тестов. Для этого добавьте логи:console.log('Current DATABASE_URL:', process.env.DATABASE_URL);
Это поможет вам диагностировать, происходит ли изменение переменной окружения должным образом перед выполнением тестов.
Заключение
Следуя приведенным рекомендациям, вы сможете успешно интегрировать динамически устанавливаемые переменные окружения в ваше приложение SvelteKit во время выполнения тестов. Это не только оптимизирует процесс тестирования, но и делает его более гибким и удобным для работы. Так вы сможете избежать использования затвердевых значений из .env
и использовать базы данных, созданные на лету в ходе работы, что значительно улучшит качество тестирования вашего приложения.