Πώς να ενσωματώσει / ανελκυστήρα / ένεση έθιμο μονάδα στοίβα με HSpec;

ψήφοι
1

Συμφραζόμενα

Έχω κάποιες Μοναδική λειτουργίες για έναν διερμηνέα που προσπαθώ να δοκιμή με HSpec. Τρέχουν με την ακόλουθη στοίβα μονάδα:

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, και έγραψα μια λειτουργία μετασχηματιστή για να πάρει ένα runAppπλαίσιο μέσα από το πλαίσιο HSpec.

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