Quelqu'un sait-il comment afficher un message d'échec personnalisé dans ScalaTest?
Par exemple:
NumberOfElements() should equal (5)
Affiche le message suivant en cas d'échec:
10 n'était pas égal à 5
Mais je veux un message plus descriptif comme:
NumberOfElements devrait être 5.
Vous êtes le premier à demander une telle fonctionnalité. Une façon d'y parvenir est avec withClue. Quelque chose comme:
withClue("NumberOfElements: ") { NumberOfElements() should be (5) }
Cela devrait vous donner ce message d'erreur:
NumberOfElements: 10 n'était pas égal à 5
Si vous souhaitez contrôler complètement le message, vous pouvez écrire un matcher personnalisé. Ou vous pouvez utiliser une assertion, comme ceci:
assert(NumberOfElements() == 5, "NumberOfElements should be 5")
Pouvez-vous préciser quel est votre cas d'utilisation? Pourquoi est-ce que 10 n'est pas égal à 5 n'est pas à la hauteur, et combien de fois avez-vous eu ce besoin?
Voici le genre de chose que vous demandez:
scala> import org.scalatest.matchers.ShouldMatchers._
import org.scalatest.matchers.ShouldMatchers._
scala> withClue ("Hi:") { 1 + 1 should equal (3) }
org.scalatest.TestFailedException: Hi: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)
scala> class AssertionHolder(f: => Any) {
| def withMessage(s: String) {
| withClue(s) { f }
| }
| }
defined class AssertionHolder
scala> implicit def convertAssertion(f: => Any) = new AssertionHolder(f)
convertAssertion: (f: => Any)AssertionHolder
scala> { 1 + 1 should equal (3) } withMessage ("Ho:")
org.scalatest.TestFailedException: Ho: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)
Donc, de cette façon, vous pouvez écrire:
{ NumberOfElements() should be (5) } withMessage ("NumberOfElements:")
Nouvelle façon depuis 2011: Matchers
et AppendedClue
traits. En outre, pour les tailles de collection, il existe des messages par défaut.
import org.scalatest.{AppendedClues, Matchers, WordSpec}
class SomeTest extends WordSpec with Matchers with AppendedClues {
"Clues" should {
"not be appended" when {
"assertions pass" in {
"hi" should equal ("hi") withClue "Greetings scala tester!"
}
}
"be appended" when {
"assertions fail" in {
1 + 1 should equal (3) withClue ", not even for large values of 1!"
}
}
"not be needed" when {
"looking at collection sizes" in {
val list = List(1, 2, 3)
list should have size 5
}
}
}
}
La sortie ressemble à ceci:
SomeTest:
Clues
should not be appended
- when assertions pass
should be appended
- when assertions fail *** FAILED ***
2 did not equal 3, not even for large values of 1! (SomeTest.scala:15)
should not be needed
- when looking at collection sizes *** FAILED ***
List(1, 2, 3) had size 3 instead of expected size 5 (SomeTest.scala:21)
Notez que le message de taille List
n'est pas idéal pour les listes contenant de longs .toString
production.
Voir scaladoc pour plus d'informations.
Vous pouvez également utiliser withClue
sans importer quoi que ce soit ou l'ajouter à la classe de test:
withClue(s"Expecting distinct elements: ${elements.toList}") { elements.length shouldBe 3 }
Il est importé de la classe Assertions
: org.scalatest.Assertions#withClue