Где я могу определить произвольные экземпляры?
Я не могу понять, где определить Arbitrary
экземпляры для моего типа данных. Если я положу его в пакет, то пакет должен иметь QuickCheck
как зависимость. Если я добавлю его в тесты, то другие пакеты не смогут использовать этот экземпляр. Если я помещу его в отдельный пакет test-utils, то тесты также должны находиться в отдельном пакете, так что это экземпляр-сирота, а также stack test --coverage
не работает
Какие еще есть варианты?
1 ответ
Я обычно выбираю отдельный вариант пакета - но тогда я не использую stack test --coverage
, Спасибо за то, что познакомили меня с этим!
(Изменить: я бы, вероятно, сделал это, а затем использовать параметр флага теста только для запуска stack test --coverage --flag thepackage:arbitrary
чтобы больше никому не приходилось иметь дело с флагами.)
Может также стоит поднять --coverage
вопрос о stack
средство отслеживания ошибок, так как было бы хорошо, чтобы проверка покрытия работала в этом случае.
Вы просите другие варианты - лучший из них, вероятно, флаг теста.
Тестовый флаг
Можно определить флаг в вашем файле cabal (по умолчанию false), который будет создавать модули только с вашей зависимостью QuickCheck, если этот флаг выбран.
Поместите нужный код в каталог arbitrary
(например). Затем добавьте эквивалент следующего к соответствующим частям вашего package.yaml
(1-й фрагмент) или the-library.cabal
(2-й фрагмент) файл:
flags:
arbitrary:
description: Compile with arbitrary instances
default: false
manual: true
library:
⁝
when:
- condition: flag(arbitrary)
dependencies:
- QuickCheck
source-dirs:
- arbitrary
flag arbitrary
description: Compile with arbitrary instances
manual: True
default: False
library
⁝
if flag(arbitrary)
hs-source-dirs:
arbitrary
build-depends:
QuickCheck
Затем пакеты, которые хотят использовать экземпляры, должны добавить следующее в свои stack.yaml
(1-й) или cabal.project
(2-е) файлы:
flag:
the-library:
arbitrary: true
constraints: the-library +arbitrary
Но есть небольшая проблема... в настоящее время нет возможности для этой библиотеки зависеть только от +arbitrary
версия только в своем тестовом наборе, если только он не определяет такой флаг. Это может быть цена, которую стоит заплатить.
Примечание: я еще не тестировал нижестоящую упаковку.
Блог Ивана Миленовича был полезен в качестве начального ресурса.
DerivingVia / Общие экземпляры
Там может быть другая возможность, теперь, когда GHC 8.6 был выпущен, с DerivingVia
, В Blöndal, Löh & Scott (2018) есть тематическое исследование для Arbitrary
экземпляров.
Вы должны создать упаковщики нового типа и реализовать Arbitrary
для тех новичков.
Это не совсем избежать проблемы, как есть. Но вы можете реализовать Generic
для этих новых типов таким образом, что экземпляры, выводимые с использованием generic-arbitrary
соответствует тому, что вы хотите.
Могут быть и другие варианты. Особенно, QuickCheck
Зависимости не так уж тяжелы. И есть и другие тестовые библиотеки. Кроме того, обратите внимание, что было некоторое обсуждение разделения Arbitrary
-подобный класс типов в автономную библиотеку.
Я бы также предложил внутренние библиотеки, но это не позволяет другим пакетам использовать ваши экземпляры.