pp response.status, response.body
end
Прежде чем мы сможем опробовать этот тестовый пример, нам сначала нужно сообщить Athena::Spec
. Обновите
require "spec"
require "../src/blog"
require "athena/spec"
ASPEC.run_all
Помимо модуля Spec
и исходного кода нашего блога, нам также требуются помощники по спецификациям, предоставляемые компонентом Framework
. Наконец, нам нужно вызвать ASPEC.run_all
, чтобы убедиться, что эти типы тестов действительно выполняются. Однако, поскольку компонент Athena Spec
не является обязательным, нам необходимо добавить его в качестве зависимости разработки, добавив следующий код в ваш файл
development_dependencies:
athena-spec:
github: athena-framework/spec
version: ~> 0.2.3
Запуск crystal spec
выявил проблему с нашей тестовой установкой. Ответ на запрос полностью зависит от состояния вашей базы данных разработки. Например, если у вас нет созданной/работающей базы данных, вы получите HTTP-ответ 500
. Если у вас есть статья с идентификатором 10
, вы получите ответ 200
, поскольку все работает как положено.
Смешивание данных базы данных разработки с данными тестирования — не лучшая идея, поскольку это усложняет управление и приводит к менее надежным тестам. Чтобы облегчить эту проблему, мы воспользуемся export DATABASE_URL=postgres://blog_user:mYAw3s0meB\!log@ localhost:5432/postgres?currentSchema=test,
и все должно работать. Еще одна вещь, которую нам нужно будет сделать, — это создать таблицы, а также создать/удалить данные о приборах. Мы собираемся немного схитрить и использовать для этого необработанный API Crystal DB, поскольку он немного выходит за рамки нашего типа EntityManager
.
Как упоминалось ранее в этой главе, для решения этой проблемы мы можем использовать некоторые обратные вызовы модуля Crystal Spec
. Давайте начнем с добавления следующего кода в файл
DATABASE = DB.open ENV["DATABASE_URL"]
Spec.before_suite do
DATABASE.exec File.read "#{__DIR__}/../db/000_setup.sql"
DATABASE.exec "ALTER DATABASE \"postgres\" SET
SEARCH_PATH TO \"test\";"
DATABASE.exec File.read "#{__DIR__}/../db/001_articles.sql"
end
Spec.after_suite do
DATABASE.exec "ALTER DATABASE \"postgres\"
SET SEARCH_PATH TO \"public\";"
DATABASE.close
end
Spec._each do
end
Здесь мы создаем константу для представления пула соединений с нашей базой данных. Затем мы определяем обратный вызов, который запускается один раз перед выполнением любого теста. В рамках этого обратного вызова мы запускаем файлы миграции базы данных, чтобы убедиться в наличии схемы и таблиц перед запуском тестов. Мы также выполняем запрос, чтобы гарантировать, что наши таблицы/запросы будут выполняться в соответствии с нашей
Теперь, когда у нас есть таблицы для хранения наших данных, нам нужно выполнить очистку, и мы уже определили, где мы будем это делать. Обновите блок Spec.before_each, чтобы он выглядел следующим образом:
Spec.before_each do
DATABASE.exec "TRUNCATE TABLE \"articles\" RESTART IDENTITY;"
end
Здесь мы удаляем все статьи, которые могли быть созданы в рамках каждого интеграционного теста. Сделав это здесь, мы можем гарантировать, что наши тесты не будут мешать друг другу.