在 Haskell 开始使用 HSpec 和 Tasty?
Getting started with HSpec and Tasty in Haskell?
我是 Haskell 的新手,我正在尝试让 hspec working with Tasty (using tasty-hspec) with Stack. I've seen an example of using tasty with HUnit 看起来像这样:
import Test.Tasty
import Test.Tasty.SmallCheck as SC
import Test.Tasty.QuickCheck as QC
import Test.Tasty.HUnit
import Data.List
import Data.Ord
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests" [properties, unitTests]
properties :: TestTree
properties = testGroup "Properties" [scProps, qcProps]
scProps = testGroup "(checked by SmallCheck)"
[ SC.testProperty "sort == sort . reverse" $
\list -> sort (list :: [Int]) == sort (reverse list)
, SC.testProperty "Fermat's little theorem" $
\x -> ((x :: Integer)^7 - x) `mod` 7 == 0
-- the following property does not hold
, SC.testProperty "Fermat's last theorem" $
\x y z n ->
(n :: Integer) >= 3 SC.==> x^n + y^n /= (z^n :: Integer)
]
qcProps = testGroup "(checked by QuickCheck)"
[ QC.testProperty "sort == sort . reverse" $
\list -> sort (list :: [Int]) == sort (reverse list)
, QC.testProperty "Fermat's little theorem" $
\x -> ((x :: Integer)^7 - x) `mod` 7 == 0
-- the following property does not hold
, QC.testProperty "Fermat's last theorem" $
\x y z n ->
(n :: Integer) >= 3 QC.==> x^n + y^n /= (z^n :: Integer)
]
unitTests = testGroup "Unit tests"
[ testCase "List comparison (different length)" $
[1, 2, 3] `compare` [1,2] @?= GT
-- the following test does not hold
, testCase "List comparison (same length)" $
[1, 2, 3] `compare` [1,2,2] @?= LT
]
但是我不想使用 hunit、smallcheck 或 quickcheck,而是想使用 hspec。我尝试了以下方法:
module Spec where
import Game
import Test.Tasty
import Test.Tasty.Hspec
spec_beats :: Spec
spec_beats = do
it "hello" $
Rock `beats` Scissors `shouldBe` True
tests :: TestTree
tests = testGroup "Tests" [spec_beats]
main = defaultMain tests
但这不能编译:
• Couldn't match type ‘hspec-core-2.7.1:Test.Hspec.Core.Spec.Monad.SpecM
() ()’
with ‘TestTree’
Expected type: TestTree
Actual type: Spec
• In the expression: spec_beats
In the second argument of ‘testGroup’, namely ‘[spec_beats]’
In the expression: testGroup "Tests" [spec_beats]
|
15 | tests = testGroup "Tests" [spec_beats]
| ^^^^^^^^^^
所以我的问题是,如何使我的 hspec 示例与 tasty 一起工作?
tasty-hspec 文档中的Examples section 有解决方法:使用testSpec
将Spec
转换为TestTree
。
spec_beats :: Spec
spec_beats = ...
main :: IO ()
main = do
tests <- testSpec "beats" spec_beats
defaultMain tests
我是 Haskell 的新手,我正在尝试让 hspec working with Tasty (using tasty-hspec) with Stack. I've seen an example of using tasty with HUnit 看起来像这样:
import Test.Tasty
import Test.Tasty.SmallCheck as SC
import Test.Tasty.QuickCheck as QC
import Test.Tasty.HUnit
import Data.List
import Data.Ord
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests" [properties, unitTests]
properties :: TestTree
properties = testGroup "Properties" [scProps, qcProps]
scProps = testGroup "(checked by SmallCheck)"
[ SC.testProperty "sort == sort . reverse" $
\list -> sort (list :: [Int]) == sort (reverse list)
, SC.testProperty "Fermat's little theorem" $
\x -> ((x :: Integer)^7 - x) `mod` 7 == 0
-- the following property does not hold
, SC.testProperty "Fermat's last theorem" $
\x y z n ->
(n :: Integer) >= 3 SC.==> x^n + y^n /= (z^n :: Integer)
]
qcProps = testGroup "(checked by QuickCheck)"
[ QC.testProperty "sort == sort . reverse" $
\list -> sort (list :: [Int]) == sort (reverse list)
, QC.testProperty "Fermat's little theorem" $
\x -> ((x :: Integer)^7 - x) `mod` 7 == 0
-- the following property does not hold
, QC.testProperty "Fermat's last theorem" $
\x y z n ->
(n :: Integer) >= 3 QC.==> x^n + y^n /= (z^n :: Integer)
]
unitTests = testGroup "Unit tests"
[ testCase "List comparison (different length)" $
[1, 2, 3] `compare` [1,2] @?= GT
-- the following test does not hold
, testCase "List comparison (same length)" $
[1, 2, 3] `compare` [1,2,2] @?= LT
]
但是我不想使用 hunit、smallcheck 或 quickcheck,而是想使用 hspec。我尝试了以下方法:
module Spec where
import Game
import Test.Tasty
import Test.Tasty.Hspec
spec_beats :: Spec
spec_beats = do
it "hello" $
Rock `beats` Scissors `shouldBe` True
tests :: TestTree
tests = testGroup "Tests" [spec_beats]
main = defaultMain tests
但这不能编译:
• Couldn't match type ‘hspec-core-2.7.1:Test.Hspec.Core.Spec.Monad.SpecM
() ()’
with ‘TestTree’
Expected type: TestTree
Actual type: Spec
• In the expression: spec_beats
In the second argument of ‘testGroup’, namely ‘[spec_beats]’
In the expression: testGroup "Tests" [spec_beats]
|
15 | tests = testGroup "Tests" [spec_beats]
| ^^^^^^^^^^
所以我的问题是,如何使我的 hspec 示例与 tasty 一起工作?
tasty-hspec 文档中的Examples section 有解决方法:使用testSpec
将Spec
转换为TestTree
。
spec_beats :: Spec
spec_beats = ...
main :: IO ()
main = do
tests <- testSpec "beats" spec_beats
defaultMain tests