Ответ 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"
}
}
}
изменить: ясность