Где я могу определить произвольные экземпляры?

Я не могу понять, где определить 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-подобный класс типов в автономную библиотеку.

Я бы также предложил внутренние библиотеки, но это не позволяет другим пакетам использовать ваши экземпляры.

Другие вопросы по тегам