DEV Community

林子篆
林子篆

Posted on • Originally published at dannypsnl.github.io on

How to test in Haskell: HSpec setup

Before you start to read, ensure you're using Cabal >= 3.0 to manage your project.

For a Haskell project, I usually use Cabal, do not have any special reason. In the xxx.cabal file, we can define some common dependencies by common block:

-- just let you know how does the file should look like
-- with full content people can understand the structure better
cabal-version:       3.0

name:                your-module
version:             0.1.0.0
license:             MIT
license-file:        LICENSE
author:              your-name
maintainer:          your-name@email.com
-- Extra files to be distributed with the package, such as examples or a
-- README.
extra-source-files:  CHANGELOG.md

-- Common block
common shared-properties
  default-language: Haskell2010
  build-depends:
    base == 4.*, mtl >= 2.2
  ghc-options:
    -Wall
Enter fullscreen mode Exit fullscreen mode

Then we can add test-suite block like this:

-- common block at here
library
  import: shared-properties
  exposed-modules:     YourModule
  other-modules:
  -- Directories containing source files.
  hs-source-dirs:      src
  default-language:    Haskell2010

test-suite spec
  import: shared-properties
  type: exitcode-stdio-1.0
  other-modules: YourModuleSpec SpecHelper
  hs-source-dirs: test
  main-is: Spec.hs
  build-depends: hspec >= 2.7
                 , hspec-discover >= 2.7
                 , your-module
  default-language:    Haskell2010
Enter fullscreen mode Exit fullscreen mode

Create $project-path/test/Spec.hs and put:

{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
Enter fullscreen mode Exit fullscreen mode

And create $project-path/test/SpecHelper.hs and put:

module SpecHelper (
  module Test.Hspec
) where

import Test.Hspec
Enter fullscreen mode Exit fullscreen mode

Finally, create $project-path/test/YourModuleSpec.hs and put:

module YourModuleSpec where
import SpecHelper
import YourModule

spec :: Spec
spec = describe "Your module" $ do
  context "has a function add can add two nature numbers" $ do
    (add 1 2) `shouldBe` 3

main :: IO ()
main = hspec spec
Enter fullscreen mode Exit fullscreen mode

Then run commands:

cabal new-update
cabal new-install --only-dependencies
cabal install hspec-discover
cabal new-configure --enable-tests
cabal new-test
Enter fullscreen mode Exit fullscreen mode

We finish the setup of testing now.

Top comments (0)