Nasıl HSpec ile / asansör / iğne özel monad yığınını entegre etmek?

oy
1

bağlam

Ben HSpec ile teste çalışıyorum tercüman bazı monadic işlevlere sahiptir. Bunlar, aşağıdaki tek hücreli yığını ile gerçekleştirilir:

type AppState = StateT InterpreterState (ExceptT Events IO)
type AppReturn a = Either Events (a, PState)

runApp :: AppState a -> IO (AppReturn a)
runApp f = runExceptT (runStateT f new)

İşte size basit birinin bir örnek:

mustEvalExpr :: Expr -> S.AppState (S.Value)
mustEvalExpr e = do
    val <- evalExpr e
    case val of
        Just val' -> return val'
        Nothing   -> throw $ S.CannotEval e

Sorun HSpec kendi bağlamı (olmasıdır IO ()), bu yüzden iki bağlamlar arasında çevirmek zorunda.

Güncel Yaklaşım

Ben HSpec kullanıyorum ve ben almak için bir transformatör fonksiyon yazdım runAppHSpec kapsamında gelen bağlam.

-- imports omitted

extract :: S.AppReturn a -> a
extract st = case st of
    Right (a, _) -> a
    Left ev      -> throw ev

run :: (S.AppReturn a -> b) -> S.AppState a -> IO b
run extractor fn = do
    state <- S.runApp fn
    return $ extractor state

Benim Yani Specböyle görünüyor:

spec :: Spec
spec = do
    describe mustEvalExpr $ do
        let badExpr = D.VarExpr $ D.Id doesntExist
            goodExpr = D.IntExpr 1
            val = S.IntValue 1

        it should evaluate and return expression if its a Just $ do
            (run extract $ do
                I.mustEvalExpr goodExpr
                ) >>= (`shouldBe` val)

        it should throw error if it gets a Nothing $ do
            (run extract $ do
                I.mustEvalExpr badExpr
                ) `shouldThrow` anyException

Soru

Bu Yapabileceğim en iyi midir? Ben gibi hissediyorum run extract $ doince olduğunu ve işler karmaşık zaman 's iyi açık olmasını düşünüyoruz.

Ben HSpec ile entegre bir yolu olup olmadığını Ama merak veya özel kod gerektirmez bu soruna yönelik bir en iyi uygulama varsa?

Oluştur 19/03/2020 saat 21:58
kaynak kullanıcı
Diğer dillerde...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more