Хорошо, я понял это.Этот вопрос не вызвал особого интереса, но в случае, если кто-то будет гуглить с той же проблемой / вопросом, вот как вы это делаете:
объекту "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