Тестирование различных баз данных на гемах рельсов - PullRequest
1 голос
/ 17 ноября 2011

Мне нужна ориентация, реализующая тесты драгоценного камня, который я хотел бы построить. Это маленький драгоценный камень, который добавляет новый метод класса к ActiveRecord::Base. Этот новый метод выполнит некоторый SQL по деманде.

Проблема в том, что выполняемый SQL зависит от серверной части базы данных. Это отличается для SQLite, Postgres и MySQL. Подпись метода ruby ​​одинакова для всех бэкэндов базы данных - только изменения SQL.

Итак, как мне сделать тесты для этого?

Чтобы уточнить: я знаю, как спросить ActiveRecord «на какой базе данных вы работаете?». Что мне нужно, так это сказать RSpec / Minitest / TestUnit: «Измените серверную часть базы данных на Postgres и повторите все тесты.

1 Ответ

2 голосов
/ 17 ноября 2011

Посмотрите, как DataMapper делает этим . Они передают переменную окружения ADAPTER при запуске спецификаций, которая изменяет гемы, которые устанавливаются / загружаются компоновщиком, и изменяет настройку соединения в помощнике спецификаций. Вы должны быть в состоянии сделать что-то подобное, в основном запуская полный пакет один раз для каждой возможной базы данных.

Это выглядит так, когда вы запускаете спецификации ядра DM:

ADAPTER=mysql bundle install
ADAPTER=mysql bundle exec spec spec

ADAPTER=sqlite bundle install
ADAPTER=sqlite bundle exec rspec spec

Я считаю, что если вы хотите получить лучшее освещение, это хороший подход. Если вы хотите выборочно тестировать разные вещи для разных частей тестов, вам просто нужно использовать условные выражения, хотя (в общем) я считаю условные выражения в тестах плохой вещью.

...