कैसे एकीकृत करने के लिए / लिफ्ट / इंजेक्षन कस्टम इकाई HSpec साथ ढेर?

वोट
1

प्रसंग

मैं एक दुभाषिया है कि मैं HSpec साथ परीक्षण करने के लिए कोशिश कर रहा हूँ के लिए कुछ monadic कार्य हैं। वे निम्नलिखित इकाई ढेर के साथ चलाएँ:

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)

यहाँ एक सरल एक का एक उदाहरण है:

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

समस्या HSpec उसके स्वयं के संदर्भ (किया है IO ()), तो मैं दो संदर्भों के बीच अनुवाद करने की है।

वर्तमान दृष्टिकोण

मैं HSpec उपयोग कर रहा हूँ, और मैं एक ट्रांसफॉर्मर समारोह लिखा एक पाने के लिए runAppHSpec संदर्भ में से संदर्भ।

-- 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

तो मेरी Specइस तरह दिखता है:

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

सवाल

यह सबसे अच्छा मैं कर सकते हैं? मुझे लगता है कि run extract $ doठीक है, और मैं इसे अच्छी स्पष्ट होना करने के लिए जब चीजें जटिल हो जाते हैं लगता है।

लेकिन मैं अगर वहाँ एक तरह से मैं HSpec साथ एकीकृत कर सकते हैं था सोच रहा था, या इस समस्या यह है कि कस्टम कोड की आवश्यकता नहीं है के लिए एक सबसे अच्छा अभ्यास है या नहीं?

19/03/2020 को 21:58
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            

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