2017-05-22 1 views
1

J'ai une méthode qui retourne un objet Try:Comment tester un essai [T] avec ScalaTest correctement?

def doSomething(p: SomeParam): Try[Something] = { 
    // code 
} 

Je veux maintenant tester cela avec ScalaTest. Actuellement, je fais comme ceci:

"My try method" should "succeed" in { 
    val maybeRes = doSomething(SomeParam("foo")) 
    maybeRes.isSuccess shouldBe true 
    val res = maybeRes.get 
    res.bar shouldBe "moo" 
} 

Cependant la vérification des isSuccess pour être true semble un peu maladroit, car pour les options et Sequences il y a des choses comme should be(empty) et shouldNot be(empty). Je ne peux rien trouver comme should be(successful).

Est-ce que cela existe ou est-ce que ma démarche est vraiment la bonne façon d'y aller?

Répondre

6

Une autre possibilité est de faire

import org.scalatest.TryValues._ 
maybeRes.success.value.bar shouldBe "moo" 

Cela donnera un message indiquant le Try n'a pas été un succès, au lieu de lancer l'exception dans maybeRes.get.

L'analogue existe pour Option, Either et PartialFunction (en utilisant l'importation concernée)

+0

C'est ce que j'ai vraiment cherché - tester le succès et obtenir l'objet résultat (qui n'est pas seulement une chaîne dans mon code réel) pour d'autres tests. – rabejens

+0

Content de pouvoir aider. Je trouve cela très utile, puisque vous pouvez l'utiliser pour différents contextes de gestion des erreurs. –

7

vérifier Juste pour voir qu'il est le type de succès avec votre valeur de retour:

maybeRes shouldBe Success("moo") 
+2

Parfois, je ne vois pas la forêt pour les arbres ... – rabejens

+0

@rabejens La manière correcte qui permet aux erreurs try échoué se propagent dans le Le pipeline de rapports de ScalaTest est 'maybeRes.success.value shouldBe" moo "', et vous obtenez cela en mélangeant 'TryValues'. La réponse ci-dessus est fausse, car la perte de précision est signalée lorsque vous masquez intentionnellement l'erreur. – flavian

+0

@flavian c'est pourquoi j'ai marqué la réponse de Cyrille Corpet comme la bonne. – rabejens

1

Vous pouvez également

import org.scalatest.TryValues._ 

// ... 

maybeRes.success.value should be "moo"