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 3O que conferir numa falha#
| Pergunta | Como | Porque |
|---|---|---|
| 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 e | handle Error pega também o 1 / 0 do seu próprio bug |
| com o valor certo? | e.value num record levantado | o chamador decide pelo campo, não pelo texto |
| nada ficou pela metade? | comparar o estado antes e depois | o débito aconteceu e o crédito não |