29 votes

Confidentialité des fonctions et tests unitaires Haskell

Comment traitez-vous avec la fonction de visibilité des tests unitaires et en Haskell?

Si vous exportez chaque fonction dans un module, de sorte que les tests unitaires ont accès, vous risque d'autres personnes à appeler des fonctions qui ne devraient pas être dans l'API publique.

J'ai pensé à l'aide d' {-# LANGUAGE CPP #-} puis environnant les exportations avec un #ifdef:

{-# LANGUAGE CPP #-}

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

Est-il un meilleur moyen?

45voto

shang Points 13051

La convention habituelle est de fractionner votre module dans publique et partie privée, c'est à dire

module SomeModule.Internal where

-- ... exports all private methods

et puis, l'API publique

module SomeModule where (export1, export2)

import SomeModule.Internal

Vous pouvez ensuite importer SomeModule.Internal dans les tests et autres endroits où ses crucial d'obtenir l'accès à l'interne, la mise en œuvre.

L'idée est que les utilisateurs de votre bibliothèque ne jamais accidentellement appel de l'API privée, mais ils peuvent l'utiliser si la savent ce qu'ils font (débogage, etc.). Cela augmente considérablement la facilité d'utilisation de la bibliothèque vous par rapport à la force de cacher les API privée.

7voto

Gabriel Riba Points 2602

Pour les tests, normalement, vous fractionnez l'application dans la cabale fichier de projet, entre une bibliothèque, la production de l'exécutable, et une suite de test exécutable qui permet de tester les fonctions de la bibliothèque, de sorte que l'assertion de test fonctions sont tenus à l'écart.

Pour les externes en fonction de la visibilité de diviser la bibliothèque de modules entre les "exposés-modules" et la section "autres modules" section.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X