Есть ли хороший способ QuickCheck Happstack.State методы? - PullRequest
2 голосов
/ 03 июня 2010

У меня есть набор методов Happstack.State MACID, которые я хочу протестировать с помощью QuickCheck, но у меня возникают проблемы с поиском наиболее элегантного способа сделать это. Проблемы, с которыми я сталкиваюсь:

  • Единственный способ оценить вычисление монады Ev - в монаде IO через query или update.
  • Нет способа создать хранилище MACID в памяти; это по замыслу . Поэтому запуск вещей в монаде IO означает, что после каждого теста есть временные файлы для очистки.
  • Нет никакого способа инициализировать новое хранилище MACID, кроме как с initialValue для состояния; он не может быть сгенерирован с помощью Arbitrary, если я не выставляю метод доступа, который заменяет состояние оптом.
  • Обойти все вышеперечисленное означает написание методов, которые используют только функции MonadReader или MonadState (и запуск теста внутри Reader или State вместо Ev. Это означает отказ от использования getRandom или getEventClockTime и т.п. внутри определений метода.

Единственные варианты, которые я вижу:

  • Запустите методы в одноразовом хранилище MACID на диске, очищайте после каждого теста и устанавливайте для запуска с initialValue каждый раз.
  • Напишите методы, чтобы большая часть кода выполнялась в MonadReader или MonadState (который легче тестируется), и полагайтесь на небольшое количество клея, не поддерживающего QuickCheck, которое вызывает getRandom или getEventClockTime при необходимости.

Есть ли лучшее решение, которое я пропускаю?

Ответы [ 2 ]

1 голос
/ 06 июня 2010

Вы можете проверить свойства быстрой проверки, которые включены в happstack-state:

http://patch -tag.com / г / Мэ / happstack / снимок / текущий / содержание / очень / happstack состояния / тесты / Happstack / Государство / Тесты

Если вы просто проводите тестирование и хотите использовать одноразовое хранилище данных, то вы можете использовать накопитель памяти, который просто сохраняет состояние, файлы событий и контрольные точки в ОЗУ. Если вы потеряете власть, то все ваше состояние будет потеряно. Это хорошо для тестов, но не для реального живого сервера. В сообщении, с которым вы ссылались, говорилось о реальных живых серверах, а не только о тестировании.

Это не поможет с проблемой initialValue, но облегчает вариант 1, поскольку вам не нужно выполнять очистку диска.

Чтобы заменить initialValue, вам нужно создать собственный метод, который заменяет текущее состояние оптовой торговли.

что-то вроде:

newState :: YourState -> Update YourState ()
newState st = put st

или что-то.

  • 1020 * Jeremy *
0 голосов
/ 06 июня 2010

Если вы напишите свои функции как полиморфные над MonadState (или MonadReader для запросов), гораздо проще будет установить тестовый комплект с помощью runState / runReader.

Генераторы кода happstack TH хороши с такими сигнатурами, насколько я помню.

...