Python
Как раз недавно использовал State для похожего теста. Мне понравилось.
Вопрос: а если так уж надо гарантировать, то может лучше без тестов гарантировать на уровне типов? Чтобы нельзя было вызвать в неправильном порядке? Ну типа чтобы вызов toKafka
можно было сделать только на том что _уже_ вызвало toDb
?
Насколько я понимаю, то на уровне типов в Скале нельзя гарантировать exactly-once вызовы методов.
Только at-least-once
def handle[F[_]: Monad](
toDB: String => F[DBUnit],
toKafka: (DBToken, String) => F[KafkaUnit],
toLog: (KafkaUnit, String) => F[LogUnit]
): String => F[(DBUnit, KafkaUnit, LogUnit)] = { in =>
for {
dbUnit <- toDB(in)
kafkaUnit <- toKafka(dbUnit, in)
// can't catch this faulty call with types
_ <- toKafka(dbUnit, in)
logUnit <- toLog(kafkaUnit, in)
} yield (dbUnit, kafkaUnit, logUnit)
}
Без linear types в этом случае никак