Подтвердить что ты не робот

Конфиденциальность функций и модульное тестирование Haskell

Как вы справляетесь с функцией видимости и модульного тестирования в Haskell?

Если вы экспортируете каждую функцию в модуле, чтобы тесты модуля имели к ним доступ, вы рискуете, что другие люди вызовут функции, которые не должны быть в общедоступном API.

Я думал об использовании {-# LANGUAGE CPP #-}, а затем окружая экспорт с помощью #ifdef:

{-# LANGUAGE CPP #-}

module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where

Есть ли лучший способ?

4b9b3361

Ответ 1

Обычным соглашением является разделение вашего модуля на публичную и частную части, то есть

module SomeModule.Internal where

-- ... exports all private methods

а затем общедоступный API

module SomeModule where (export1, export2)

import SomeModule.Internal

Затем вы можете импортировать SomeModule.Internal в тесте и в других местах, где важно получить доступ к внутренней реализации.

Идея состоит в том, что пользователи вашей библиотеки никогда случайно не называют частный API, но могут использовать его, если знают, что делают (отладка и т.д.). Это значительно увеличивает удобство использования вашей библиотеки по сравнению с принудительным скрытием частного API.

Ответ 2

Для тестирования вы обычно разбиваете приложение в файле проекта cabal, между библиотекой, производственным исполняемым файлом и test-suite, который проверяет функции библиотеки, поэтому функции утверждения теста сохраняются отдельно.

Для визуализации внешней функции вы разбиваете библиотечные модули между секцией "открытых модулей" и секцией "другие модули".