Pular para o conteúdo

Testar erros e exceções

Que ele falha, com que tipo, com que mensagem — e que não falhou pela metade.

O caminho de erro é o menos testado e o que mais aparece em produção. Três perguntas por falha: ela acontece?, com o tipo certo?, deixou tudo como estava? A terceira é a que quase ninguém escreve.

dataforge
adopt Arcane.Crucible

record SaldoInsuficiente:
    pedido: Float
    disponivel: Float

contas := {"ana": 100.0, "bia": 0.0}

action transferir(de, para, valor):
    given valor smaller_eq 0:
        trigger "valor precisa ser positivo"
    given contas[de] smaller valor:
        trigger SaldoInsuficiente(valor, contas[de])
    contas[de] -= valor
    contas[para] += valor

crucible "transferir":
    trial "falha com o tipo do dominio":
        monitor:
            transferir("bia", "ana", 10.0)
            Crucible.fail("devia ter levantado")
        handle SaldoInsuficiente as e:
            expect e.value.disponivel is 0.0

    trial "a mensagem diz o que fazer":
        expect(lambda => transferir("ana", "bia", -5)).to_raise()

    trial "a falha nao deixa nada pela metade":
        antes := {"ana": contas["ana"], "bia": contas["bia"]}
        monitor:
            transferir("ana", "bia", 1000.0)
        handle Error:
            antes := antes
        expect contas["ana"] is antes["ana"]
        expect contas["bia"] is antes["bia"]

r := Crucible.run()
assert r["falhou"] is 0 and r["passou"] is 3

O que conferir numa falha#

PerguntaComoPorque
ela acontece?expect(lambda => …).to_raise()o lambda adia a chamada — sem ele o erro estoura antes do expect
com o tipo certo?handle SeuTipo as ehandle Error pega também o 1 / 0 do seu próprio bug
com o valor certo?e.value num record levantadoo chamador decide pelo campo, não pelo texto
nada ficou pela metade?comparar o estado antes e depoiso débito aconteceu e o crédito não

Continue em Regressão e Erros.