Lorsque je travaille sur des tests avec FeatureSpec et que j'utilise scenario, j'ai une partie de mon code qui envoie une classe de cas "échec" (c'est-à-dire ApplesNotAllowed) et est utilisée via un scalaz disjonction.

Exemple rapide:

val result = if (order.value != 10) {
    -\/(ApplesNotSupported(orderNumber))
  } else {
    \/-Option.empty[Orange]
  }

Dans ma suite de tests, je peux facilement tester le cas où je reçois un Option.empty[Orange] en m'attendant à ce qu'il shouldBe None. Cependant, je rencontre un problème lorsque je veux tester la classe de cas ApplesNotSupported renvoyée. Comment m'attendrais-je à cet «échec» qui reconnaîtra le test comme étant réussi puisque nous voulons que cet «échec» se produise? Chaque fois que j'essaye d'exécuter mon scénario, j'obtiens l'erreur:

Validation is not success ApplesNotSupported(orderNumber)

Essayer d'utiliser interrupt ne résout pas le problème car ce n'est pas une exception, et nous ne voulons pas non plus délibérément fail le test. Cela pourrait-il être un problème avec l'utilisation de scalaz et ScalaTest?

Je suis assez nouveau dans la programmation fonctionnelle et la programmation dans Scala en général, donc toutes les ressources ou suggestions m'aident car j'ai du mal à rechercher de la documentation.

1
abhi 21 avril 2017 à 03:50

3 réponses

Meilleure réponse

Vous voudrez peut-être chercher à utiliser des matchers de disjonction lors du test des disjonctions: https://github.com/typelevel/ scalaz-scalatest / blob / master / src / main / scala / DisjunctionMatchers.scala

C'est la meilleure façon de tester en fonction du résultat d'une disjonction. Vous pouvez faire correspondre en fonction de la disjonction elle-même:

must be_\/-
must be_-\/

Ou allez plus loin et faites correspondre le résultat de la disjonction et la valeur qu'elle contient:

must be_\/-(value)
must be_-\/(value)

Je n'utilise pas personnellement ScalaTest, mais il semble que cela devrait être le même que dans specs2.

4
Charles 21 avril 2017 à 01:34

Qu'en est-il de l'encapsuler dans Essayez et faites quelque chose comme ceci:

import org.scalatest.{FunSuite, Matchers}
import org.specs2.mock.Mockito

import scala.util.{Failure, Success, Try}

/**
  * Created by ssharma on 4/18/17.
  */
class UnitTest extends FunSuite with Matchers{
     class A {

       def t1(x: Int): Try[Int] = Try(t(x))

       private def t(x: Int): Int = {
         x match {
           case 1 => 1
           case _ => throw new RuntimeException
         }
       }
     }

  test("A") {
    val b = new A
    assert(b.t1(1)isSuccess)
  }

  test("A fail") {
    val b = new A
    assert(b.t1(2)isFailure)
  }
}
1
Sumeet Sharma 21 avril 2017 à 02:26

Je ne connais ni le scalaz ni les disjonctions, mais cela ressemble à la fonctionnalité d'interception dans les assertions de scalatest (http: // www.scalatest.org/user_guide/using_assertions) peut vous aider.

Vous définissez le type d'exception que vous attendez avec interception et vous exécutez le code qui lèvera l'exception dans la fonction. Vous pouvez attribuer le résultat de intercept à un val que vous pouvez ensuite comparer à la valeur attendue en utilisant assert ou assertResult de scalatest.

J'espère que cela peut vous aider! :)

0
cdncat 21 avril 2017 à 01:48