L'écriture d'un test unitaire dans Haskell où une expression doit échouer lorsque undefined
est rencontré est un peu délicat. J'ai essayé ce qui suit avec HSpec:Test unitaire de l'undefined évalué dans l'expression paresseuse dans Haskell
module Main where
import Test.Hspec
import Control.Exception (evaluate)
main :: IO()
main = hspec $ do
describe "Test" $ do
it "test case" $ do
evaluate (take 1 $ map (+1) [undefined, 2, 3]) `shouldThrow` anyException
en vain. Il me rapporte did not get expected exception: SomeException
Si j'évalue la même expression dans REPL, je reçois:
[*** Exception: Prelude.undefined
CallStack (from HasCallStack):
error, called at libraries\base\GHC\Err.hs:79:14 in base:GHC.Err
undefined, called at <interactive>:2:20 in interactive:Ghci1
Cette réponse est bonne, mais je suis confus quand vous dites que 'evaluate' n'évalue pas à WHNF quand [les docs déclarent explicitement qu'il évalue son argument à WHNF] (https://hackage.haskell.org /package/base-4.9.0.0/docs/Control-Exception.html#v:evaluate). –
@AlexisKing Je suis corrigé! Dans tous les cas, WNHF ne suffit pas, d'où la nécessité de "NFData". – Alec
Donc, en fait, le test passe parce qu'il produit une liste avec un seul élément indéfini? Pourquoi la fonction (+1) n'est-elle pas appliquée? –