Подтвердить что ты не робот

Scala/Подъем: как я могу написать модульные тесты, которые проверяют ответ фрагмента на разные параметры

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

Например, с выводом фрагмента в этом 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?

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

Спасибо,

Блейк

4b9b3361

Ответ 1

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

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

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

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

Вторая проблема, касающаяся непреложности S.attr, решается с помощью метода "S" "с Attrs". "withAttrs" выполняет блок кода, который вы предоставляете как с его регулярными атрибутами, так и с атрибутами, предоставленными вами на карте. Ваши произвольные атрибуты доступны только из S.attr временно

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

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

изменить: ясность