簡體   English   中英

使用Hspec進行單元測試IO操作

[英]Unit testing IO actions with Hspec

在類似的情況下,我發現了其他問題,但是在這種特定情況下,沒有任何問題可以回答我的問題。 此外,似乎幾乎沒有資源可以簡單地涵蓋Haskell中的單元測試IO操作的主題。

假設我的數據庫通信具有此類型類:

data Something = Something String deriving Show

class MonadIO m => MonadDB m where
  getSomething :: String -> m Something
  getSomething s = do
    ... -- assume a DB call is made and an otherwise valid function

instance MonadDB IO 

和使用它的函數:

getIt :: MonadDB m => m (Int, Something)
getIt = do
  s@(Something str) <- getSomething "hi"
  return (length str, s) -- excuse the contrived example

我希望使用hspec測試此getIt函數,但不與數據庫進行通信,這大概意味着要替換它使用的MonadDB ,但是我如何實現呢?

這對您有用嗎?

#!/usr/bin/env stack
-- stack exec --package transformers --package hspec -- ghci
import Control.Monad.IO.Class
import Control.Monad.Trans.Identity

import Data.Char
import Test.Hspec

data Something = Something String deriving (Eq, Show)

class MonadIO m => MonadDB m where
  getSomething :: String -> m Something
  getSomething s = return $ Something (map toUpper s)

instance MonadDB IO

instance MonadIO m => MonadDB (IdentityT m)

getIt :: MonadDB m => m (Int, Something)
getIt = do
  s@(Something str) <- getSomething "hi"
  return (length str, s)

main :: IO ()
main = hspec $ do
  describe "Some tests" $ do
    it "test getIt" $ do
      runIdentityT getIt `shouldReturn` (2, Something "HI")

    it "test getIt should fail" $ do
      runIdentityT getIt `shouldReturn` (1, Something "HI")

您也許還可以使用ReaderTStateT為測試查詢“提供”數據或getSomething的轉換。

編輯:在hspec中使用示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM