如何在 Haskell 中使用 HUnit 测试我自己的数据类型?
How to test my own data Types using HUnit in Haskell?
Queue.hs的一部分:
module Queue ( Queue, emptyQueue, isEmptyQueue, enQueue, deQueue ) where
data Queue a = EmptyQueue | Single a | Q a ( Queue a ) a deriving (Show, Eq)
emptyQueue :: Queue a
emptyQueue = EmptyQueue
enQueue :: a -> Queue a -> Queue a
enQueue x EmptyQueue = Single x
enQueue x (Single q) = Q q (EmptyQueue) x
enQueue x (Q qf q qb) = Q qf (enQueue qb q) x
我用的是打印,看他们是否一一纠正。
现在我想用 HUint 测试它们。
Main.hs:
module Main where
import Queue
import Test.HUnit
test1 = TestCase $ assertEqual "" (Single 'a'::Queue Char) $ enQueue 'a' emptyQueue
tests = TestList [TestLabel "test1" test1]
main = do runTestTT tests
这是我得到的:
*Queue> :r
[2 of 2] Compiling Main ( Main.hs, interpreted )
Main.hs:5:36: Not in scope: data constructor ‘Single’
Failed, modules loaded: Queue.
那我该如何解决呢?
似乎 Queue
数据类型应该是抽象和不透明的,因此公开所有构造函数不是一个好主意。但是,您可以将您的实现拆分为两个子模块:
module Queue.Internal where --expose all internal stuff
data Queue = <...>
module Queue (Queue, emptyQueue, <...>) where --expose user API only
import Queue.Internal
module Queue.Tests where
import Queue.Internal --to get access to „guts“
test = <...>
module Main where
import Queue --to just use the type
一些库类型(如 ByteString
s)是这样制作的。
Queue.hs的一部分:
module Queue ( Queue, emptyQueue, isEmptyQueue, enQueue, deQueue ) where
data Queue a = EmptyQueue | Single a | Q a ( Queue a ) a deriving (Show, Eq)
emptyQueue :: Queue a
emptyQueue = EmptyQueue
enQueue :: a -> Queue a -> Queue a
enQueue x EmptyQueue = Single x
enQueue x (Single q) = Q q (EmptyQueue) x
enQueue x (Q qf q qb) = Q qf (enQueue qb q) x
我用的是打印,看他们是否一一纠正。 现在我想用 HUint 测试它们。
Main.hs:
module Main where
import Queue
import Test.HUnit
test1 = TestCase $ assertEqual "" (Single 'a'::Queue Char) $ enQueue 'a' emptyQueue
tests = TestList [TestLabel "test1" test1]
main = do runTestTT tests
这是我得到的:
*Queue> :r
[2 of 2] Compiling Main ( Main.hs, interpreted )
Main.hs:5:36: Not in scope: data constructor ‘Single’
Failed, modules loaded: Queue.
那我该如何解决呢?
似乎 Queue
数据类型应该是抽象和不透明的,因此公开所有构造函数不是一个好主意。但是,您可以将您的实现拆分为两个子模块:
module Queue.Internal where --expose all internal stuff
data Queue = <...>
module Queue (Queue, emptyQueue, <...>) where --expose user API only
import Queue.Internal
module Queue.Tests where
import Queue.Internal --to get access to „guts“
test = <...>
module Main where
import Queue --to just use the type
一些库类型(如 ByteString
s)是这样制作的。