[英]Haskell: Multiple Assertions in Unit Testing?
我查找了一個類似的主題,並從這里找到了這段代碼: https://stackoverflow.com/a/21419654/14386048
去引用:
假設我們有模塊SafePrelude.hs
:
module SafePrelude where
safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead (x:_) = Just x
我們可以將測試放入TestSafePrelude.hs
,如下所示:
module TestSafePrelude where
import Test.HUnit
import SafePrelude
testSafeHeadForEmptyList :: Test
testSafeHeadForEmptyList =
TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
testSafeHeadForNonEmptyList :: Test
testSafeHeadForNonEmptyList =
TestCase $ assertEqual "Should return (Just head) for non empty list" (Just 1)
(safeHead ([1]::[Int]))
main :: IO Counts
main = runTestTT $ TestList [testSafeHeadForEmptyList, testSafeHeadForNonEmptyList]
-- 結束報價 --
是否可以在testSafeHeadForEmptyList
中有多個斷言? 我正在嘗試對類似案例的測試樣本進行分類,但只是不同的變體。 我想避免下面這樣的事情(假設每個 assert equal 都有不同的變化,但都應該什么都不返回,例如):
testSafeHeadForEmptyList :: Test
testSafeHeadForEmptyList =
TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
testSafeHeadForEmptyList2 :: Test
testSafeHeadForEmptyList2 =
TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
...
testSafeHeadForEmptyList99 :: Test
testSafeHeadForEmptyList99 =
TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
這在 Haskell 中是否可行?
如果你仔細看這里: Test
- 你看到TestCase
和TestList
是Test
類型的數據構造器 - 所以你應該能夠做這樣的事情:
testSafeHeadForEmptyList :: Test
testSafeHeadForEmptyList = TestList $
[ TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
, TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
...
, TestCase $ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
]
如果您願意,甚至可以fmap
TestCase
構造函數:
testSafeHeadForEmptyList :: Test
testSafeHeadForEmptyList = TestList $ fmap TestCase
[ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
, assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
...
, assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
]
當然TestLabel
也是一個構造函數,因此您可以將 Label 粘貼到它上:
testSafeHeadForEmptyList :: Test
testSafeHeadForEmptyList =
TestLabel "safe head for empty list" $ TestList $ fmap TestCase
[ assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
, assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
...
, assertEqual "Should return Nothing for empty list"
Nothing (safeHead ([]::[Int]))
]
(當然,你也可以使用(~:)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.