13 votes

Scala / Lift : Comment écrire des tests unitaires qui testent la réponse d'un snippet à différents paramètres ?

J'essaie d'écrire un test Specs2 qui testera la sortie d'un snippet en réponse à différents paramètres qui seraient normalement passés dans un modèle, mais je n'ai pas réussi à trouver comment le faire.

Par exemple, avec le texte de l'extrait dans cette division :

<div class="lift:Snippet.method?param1=foo"></div>

Je passe le paramètre param1 au snippet. Mon snippet ressemblerait à quelque chose comme ceci :

class Snippet {
  def method(in:NodeSeq):NodeSeq = {
    val param1 = S.attr("param1") openOr ""
    param1 match {
      case "foo" => //do something
      case "bar" => //do something else
      case _ => //do yet another thing
    }
  }
}

Ainsi, dans mon test, je veux tester comment le snippet répond à différentes valeurs du paramètre 1.

class SnippetTest extends Specification {
  "Snippet" should {
    "do something" in {
      val html = <ul>
          <li class="first">
          <li class="second">
          <li class="third">
        </ul>

      //I need to set param1 here somehow
      val out = Snippet.method(html)
      //then check that it did what it was supposed to
      out.something must be "xyz"
    }
  }
}

Comment définir le paramètre 1 ?

Je suis un novice en matière de scala et d'ascenseur (je viens de python+django), donc si je me trompe d'arbre, veuillez me diriger vers le bon. Je pense que c'est peut-être le cas, j'ai cherché sur Google toute la journée et je n'ai trouvé aucune question similaire à celle-ci.

Merci,

Blake

11voto

Blake Points 631

Ok, j'ai trouvé une solution. Cette question n'a pas suscité beaucoup d'intérêt, mais au cas où quelqu'un se trouverait sur Google avec le même problème ou la même question, voici comment procéder :

L'objet "S" de Lift a besoin qu'on lui ajoute nos attributs arbitraires afin qu'il donne à notre snippet les attributs que nous voulons tester quand on le lui demande. Malheureusement, il y a deux problèmes. Premièrement, l'objet "S" n'est initialisé que lorsqu'une requête http est reçue. Deuxièmement, S.attr est immuable.

Lift a un paquet appelé mockweb qui vous permet de faire des requêtes http fictives. La documentation de ce paquet parle généralement de sessions de test, de connexions d'utilisateurs et autres, mais il fournit également des mécanismes pour initialiser "S" dans le cadre d'un test de spécification.

Le premier problème, l'initialisation de S, est résolu en définissant notre classe de test comme une extension de WebSpec au lieu de Specification (WebSpec fait partie du paquet mockweb et étend Specification), et en appelant "withSFor" pendant la définition de la spécification, ce qui initialisera "S".

Le deuxième problème, à savoir que S.attr est immuable, est résolu par la méthode "S" "withAttrs". La méthode "withAttrs" exécute un bloc de code que vous fournissez avec ses attributs habituels et les attributs que vous avez fournis dans une carte. Vos attributs arbitraires ne sont disponibles qu'à partir de S.attr temporairement.

Voici le test de ma question originale qui a été modifié pour résoudre les 2 problèmes :

import net.liftweb.mockweb._

class SnippetTest extends WebSpec {
  "Snippet" should {
    "do something" withSFor("/") in {
      val html = <ul>
          <li class="first">
          <li class="second">
          <li class="third">
        </ul>

      //here I set param1
      var m = new HashMap[String, String]
      m += "param1" -> "foo"

      val s = new Snippet()

      //then tell S to execute this block of code
      //with my arbitrary attributes.
      //'out' will be the NodeSeq returned by s.method
      val out = S.withAttrs(S.mapToAttrs(m)){
        s.method(html)
      }

      //then check that it did what it was supposed to
      out.something must be "xyz"
    }
  }
}

edit : clarté

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X