Если мы хотим поддерживать разные методы составления запроса, мы должны абстрагироваться от них.Вы можете заставить свои обработчики принимать в качестве аргумента функцию, выполняющую HTTP-запросы, а затем передавать различные функции для тестирования и производства.Если у вас есть более одной связанной функции, поместите их в запись ( шаблон ручки ).
Если мы используем cabal-install > 2.0(с помощью команд new- * ) другим возможным вариантом является использование сигнатуры модуля для переключения реализаций между набором тестов и конечным исполняемым приложением.Это решение также интенсивно использует функцию внутренних удобных библиотек Cabal.
Основная идея заключается в следующем: мы помещаем наше приложение Spock в его собственную библиотеку, но не делаем его зависимым от WREQ напрямую.Вместо этого мы объявляем в той же библиотеке сигнатуру Requests.hsig
следующим образом:
signature SomeSpockApp.Requests where
import Data.Aeson (FromJSON)
data Token
doGET :: FromJSON a => String -> Token -> IO a
Она определяет высокоуровневый интерфейс для выполнения HTTP-запросов.Код в библиотеке импортирует эту подпись.Для остальной части кода в библиотеке SomeSpockApp.Requests
- это просто еще один модуль.
Далее мы определим вспомогательную библиотеку, которая будет предоставлять фактический модуль SomeSpockApp.Requests
(то же имя, что и у подписи, за исключением того, что сейчасэто hs
файл).Он будет содержать «ложный» код.Конечно, определение doGET
должно быть совместимо с подписью.
Мы также определяем другую вспомогательную библиотеку с другим модулем SomeSpockApp.Requests
.Это должно зависеть от wreq и выполнять методы нашей подписи с использованием функций wreq.
В наборе тестов мы должны зависеть как от нашей библиотеки приложений Spock, так и от библиотеки mock.Имена сигнатуры и макета модуля реализации выстраиваются идеально, поэтому больше ничего делать не нужно.(Если имена не совпадают, мы можем использовать mixins раздел в файле cabal для переименования модуля).
В исполняемом приложении мы должны зависетькак в нашей библиотеке приложений Spock, так и в библиотеке использования wreq