haskell - Haskell 中的 HSpec 和 Tasty 入门?

标签 haskell hspec

我是 Haskell 新手,我正在尝试获取 hspecTasty 合作(使用 tasty-hspec )与 Stack 。我见过example使用美味 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 示例与美味一起工作?

最佳答案

Examples section在 tatary-hspec 的文档中有解决方案:使用 testSpecSpec 转换为 TestTree

spec_beats :: Spec
spec_beats = ...

main :: IO ()
main = do
  tests <- testSpec "beats" spec_beats
  defaultMain tests

关于haskell - Haskell 中的 HSpec 和 Tasty 入门?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59342263/

相关文章:

haskell - 使用 MonadIO 测试类型类 : "No instance nor default method" error

haskell - 将 HSpec 与堆栈结合使用

haskell - 在处理许多不相关的类型时避免样板

function - 我对构图的理解存在差距,类型不匹配

haskell - 受限异构列表

python - haskell 类型声明的使用方式是否与 python 类/函数文档相同?

haskell - 找不到模块 ‘Test.Hspec.Discover’

haskell - 数据类型在函数参数内不起作用

haskell - 使用 HSpec 和 QuickCheck 验证 Data.Monoid 属性

haskell - 选择要使用 Hspec 和堆栈运行的测试