Scala / Lift: Как мне написать модульные тесты, которые проверяют отклик сниппета на разные параметры - PullRequest
13 голосов
/ 01 февраля 2012

Я пытаюсь написать тест Specs2, который будет проверять вывод фрагмента в ответ на различные параметры, которые обычно передаются из шаблона, но я не смог выяснить, как это сделать.

Например, с помощью вызова фрагмента в этом div:

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

Я передаю параметр param1 во фрагмент.Мой фрагмент будет выглядеть примерно так:

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
    }
  }
}

Итак, в моем тесте я хочу проверить, как фрагмент реагирует на различные значения param1

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"
    }
  }
}

Как установить param1?

Я большой скала и поднимаю новичка (пришедшего из python + django), поэтому, если я лаю не на том дереве, пожалуйста, направьте меня к правильному.Я думаю, что это может быть так, я гуглил это весь день и не нашел вопросов, отдаленно похожих на этот.

Спасибо,

Блейк

1 Ответ

11 голосов
/ 02 февраля 2012

Хорошо, я понял это.Этот вопрос не вызвал особого интереса, но в случае, если кто-то будет гуглить с той же проблемой / вопросом, вот как вы это делаете:

объекту "S" лифта необходимо добавить наши произвольные атрибуты вэто так, что он даст нашему фрагменту атрибуты, которые мы хотим проверить, когда их спросят.К сожалению, есть 2 проблемы.Во-первых, объект «S» инициализируется только при получении http-запроса.Во-вторых, S.attr является неизменяемым.

В Lift есть пакет под названием mockweb, который позволяет вам делать фиктивные http-запросы.Документация для этого пакета обычно говорит о сеансах тестирования и входах пользователей в систему и тому подобное, но также предоставляет механизмы для инициализации «S» как части теста спецификации.

Первая проблема, инициализация S, решается путем определениянаш тестовый класс как расширение WebSpec вместо Specification (WebSpec является частью пакета mockweb и расширяет Specification) и вызывает «withSFor» во время определения спецификации, что инициализирует «S»

Вторая проблема,Работа с S.attr неизменяемостью решается с помощью метода «S» «withAttrs».«withAttrs» выполняет блок кода, который вы предоставляете, как с обычными атрибутами, так и с атрибутами, предоставленными вами на карте.Ваши произвольные атрибуты доступны только из S.attr временно

Вот тест из моего исходного вопроса, который был изменен для решения 2 задач:

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: clearity

...