Here is the code (from the Lift Framework Cookbook):
package code.snippet
import scala.xml.Text
import net.liftweb.util.Helpers._
/**
* Created by kaiyin on 20/06/15.
*/
class Animals {
def list = {
val animals = List(
("Dog", "(Canis lupus)"),
("Cat", "(Felis catus)"),
("Giraffe", "(Giraffa camelopardalis)"),
("Lion", "(Panthera leo)"),
("Horse", "(Equus ferus caballus)")
)
"li *" #> animals.map{
a =>
".name *" #> Text(a._1) &
".sname *" #> Text(a._2)
}
}
}
package code.snippet
/**
* Created by kaiyin on 20/06/15.
*/
import org.specs2.mutable._
class AnimalsSpec extends Specification {
"Animals list" should {
"contains 5 animals" in {
val result = <ul>
<li><span class="name">Dog</span> - <span class="sname">(Canis lupus familiaris)</span> </li>
<li><span class="name">Cat</span> - <span class="sname">(Felis catus)</span></li>
<li><span class="name">Giraffe</span> - <span class="sname">(Giraffa camelopardalis)</span></li>
<li><span class="name">Lion</span> - <span class="sname">(Panthera leo)</span></li>
<li><span class="name">Horse</span> - <span class="sname">(Equus ferus caballus)</span></li>
</ul>
val nodeSeq = Animals.list(<ul><li><span class="name"></span> - <span class="sname"></span></li></ul>)
nodeSeq.toString must ==/ (result)
// result.toString must ==/ (result.toString)
}
// "trivial" in {
// "what" must ==/ ("what")
// }
}
}
When I test
in sbt, I got an error:
[error] /private/tmp/lift-lift_26_sbt-d71cccf/scala_211/contacts-app/src/test/scala/code/snippet/AnimalsSpec.scala:21: not found: value Animals
[error] val nodeSeq = Animals.list(<ul><li><span class="name"></span> - <span class="sname"></span></li></ul>)
[error] ^
[error] one error found
[error] (test:compile) Compilation failed
[error] Total time: 0 s, completed Jun 21, 2015 12:14:12 AM
It seems specs2 can't recognize the existence of the Animals class.
Directory structure:
.
├── build.sbt
├── console.devmode.log
├── project
│ ├── build.properties
│ ├── plugins.sbt
│ ├── project
│ │ └── target
│ │ └── config-classes
│ │ ├── $3e6a7b084670fb8947b9$.class
│ │ ├── $3e6a7b084670fb8947b9.cache
│ │ ├── $3e6a7b084670fb8947b9.class
│ │ ├── $8ee94f9a958d7b2659d3$.class
│ │ ├── $8ee94f9a958d7b2659d3.cache
│ │ ├── $8ee94f9a958d7b2659d3.class
│ │ ├── $f7c7d83ab25f0dfdaa50$.class
│ │ ├── $f7c7d83ab25f0dfdaa50.cache
│ │ └── $f7c7d83ab25f0dfdaa50.class
│ └── target
│ ├── config-classes
│ │ ├── $0849881d22cdcd44948f$$anonfun$$sbtdef$1.class
│ │ ├── $0849881d22cdcd44948f$.class
│ │ ├── $0849881d22cdcd44948f.cache
│ │ ├── $0849881d22cdcd44948f.class
│ │ ├── $249c304e0f040361c72d$$anonfun$$sbtdef$1.class
│ │ ├── $249c304e0f040361c72d$.class
│ │ ├── $249c304e0f040361c72d.cache
│ │ ├── $249c304e0f040361c72d.class
│ │ ├── $2a1513b04e5e84f6d714$$anonfun$$sbtdef$1.class
│ │ ├── $2a1513b04e5e84f6d714$.class
│ │ ├── $2a1513b04e5e84f6d714.cache
│ │ ├── $2a1513b04e5e84f6d714.class
│ │ ├── $3067d2a3c14aabb8a3f0$$anonfun$$sbtdef$1.class
│ │ ├── $3067d2a3c14aabb8a3f0$.class
│ │ ├── $3067d2a3c14aabb8a3f0.cache
│ │ ├── $3067d2a3c14aabb8a3f0.class
│ │ ├── $3a0715de5358d1f4e97f$$anonfun$$sbtdef$1.class
│ │ ├── $3a0715de5358d1f4e97f$.class
│ │ ├── $3a0715de5358d1f4e97f.cache
│ │ ├── $3a0715de5358d1f4e97f.class
│ │ ├── $86ef5cf155e942bdbe26$$anonfun$$sbtdef$1.class
│ │ ├── $86ef5cf155e942bdbe26$.class
│ │ ├── $86ef5cf155e942bdbe26.cache
│ │ ├── $86ef5cf155e942bdbe26.class
│ │ ├── $9696ca6e6d83674bcec7$$anonfun$$sbtdef$1.class
│ │ ├── $9696ca6e6d83674bcec7$.class
│ │ ├── $9696ca6e6d83674bcec7.cache
│ │ ├── $9696ca6e6d83674bcec7.class
│ │ ├── $99247c8be4b0760fec21$$anonfun$$sbtdef$1.class
│ │ ├── $99247c8be4b0760fec21$.class
│ │ ├── $99247c8be4b0760fec21.cache
│ │ ├── $99247c8be4b0760fec21.class
│ │ ├── $ad1c698366eb4866d3f8$$anonfun$$sbtdef$1.class
│ │ ├── $ad1c698366eb4866d3f8$.class
│ │ ├── $ad1c698366eb4866d3f8.cache
│ │ ├── $ad1c698366eb4866d3f8.class
│ │ ├── $b5fc3f4c63982e743df0$$anonfun$$sbtdef$1.class
│ │ ├── $b5fc3f4c63982e743df0$.class
│ │ ├── $b5fc3f4c63982e743df0.cache
│ │ ├── $b5fc3f4c63982e743df0.class
│ │ ├── $cec870caf77a892e02d5$$anonfun$$sbtdef$1$$anonfun$apply$1.class
│ │ ├── $cec870caf77a892e02d5$$anonfun$$sbtdef$1.class
│ │ ├── $cec870caf77a892e02d5$.class
│ │ ├── $cec870caf77a892e02d5.cache
│ │ ├── $cec870caf77a892e02d5.class
│ │ ├── $e22cedfd25e30fceaff3$.class
│ │ ├── $e22cedfd25e30fceaff3.cache
│ │ ├── $e22cedfd25e30fceaff3.class
│ │ ├── $e73abf325c03d09873ef$$anonfun$$sbtdef$1.class
│ │ ├── $e73abf325c03d09873ef$.class
│ │ ├── $e73abf325c03d09873ef.cache
│ │ └── $e73abf325c03d09873ef.class
│ ├── resolution-cache
│ │ ├── default
│ │ │ └── contacts-app-build
│ │ │ └── scala_2.10
│ │ │ └── sbt_0.13
│ │ │ └── 0.1-SNAPSHOT
│ │ │ ├── resolved.xml.properties
│ │ │ └── resolved.xml.xml
│ │ └── reports
│ │ ├── default-contacts-app-build-compile-internal.xml
│ │ ├── default-contacts-app-build-compile.xml
│ │ ├── default-contacts-app-build-docs.xml
│ │ ├── default-contacts-app-build-optional.xml
│ │ ├── default-contacts-app-build-plugin.xml
│ │ ├── default-contacts-app-build-pom.xml
│ │ ├── default-contacts-app-build-provided.xml
│ │ ├── default-contacts-app-build-runtime-internal.xml
│ │ ├── default-contacts-app-build-runtime.xml
│ │ ├── default-contacts-app-build-scala-tool.xml
│ │ ├── default-contacts-app-build-sources.xml
│ │ ├── default-contacts-app-build-test-internal.xml
│ │ ├── default-contacts-app-build-test.xml
│ │ ├── ivy-report.css
│ │ └── ivy-report.xsl
│ ├── scala-2.10
│ │ └── sbt-0.13
│ └── streams
│ ├── $global
│ │ ├── $global
│ │ │ └── $global
│ │ │ └── out
│ │ ├── ivyConfiguration
│ │ │ └── $global
│ │ │ └── out
│ │ ├── ivySbt
│ │ │ └── $global
│ │ │ └── out
│ │ ├── projectDescriptors
│ │ │ └── $global
│ │ │ └── out
│ │ └── update
│ │ └── $global
│ │ ├── inputs
│ │ ├── out
│ │ └── output
│ ├── compile
│ │ ├── $global
│ │ │ └── $global
│ │ │ └── data
│ │ ├── compile
│ │ │ └── $global
│ │ │ ├── export
│ │ │ └── out
│ │ ├── copyResources
│ │ │ └── $global
│ │ │ ├── copy-resources
│ │ │ └── out
│ │ ├── definedSbtPlugins
│ │ │ └── $global
│ │ │ └── out
│ │ ├── dependencyClasspath
│ │ │ └── $global
│ │ │ └── export
│ │ ├── exportedProducts
│ │ │ └── $global
│ │ │ └── export
│ │ ├── externalDependencyClasspath
│ │ │ └── $global
│ │ │ └── export
│ │ ├── incCompileSetup
│ │ │ └── $global
│ │ ├── internalDependencyClasspath
│ │ │ └── $global
│ │ │ └── export
│ │ ├── managedClasspath
│ │ │ └── $global
│ │ │ └── export
│ │ ├── unmanagedClasspath
│ │ │ └── $global
│ │ │ └── export
│ │ └── unmanagedJars
│ │ └── $global
│ │ └── export
│ └── runtime
│ ├── dependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── exportedProducts
│ │ └── $global
│ │ └── export
│ ├── externalDependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── fullClasspath
│ │ └── $global
│ │ └── export
│ ├── internalDependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── managedClasspath
│ │ └── $global
│ │ └── export
│ ├── unmanagedClasspath
│ │ └── $global
│ │ └── export
│ └── unmanagedJars
│ └── $global
│ └── export
├── sbt
├── sbt-launch-0.13.1.jar
├── sbt.bat
├── src
│ ├── main
│ │ ├── resources
│ │ │ ├── logback.xml
│ │ │ ├── props
│ │ │ │ └── default.props
│ │ │ ├── resources.properties
│ │ │ ├── resources_de.properties
│ │ │ └── resources_fr_FR.properties
│ │ ├── scala
│ │ │ ├── bootstrap
│ │ │ │ └── liftweb
│ │ │ │ └── Boot.scala
│ │ │ └── code
│ │ │ ├── comet
│ │ │ ├── lib
│ │ │ │ └── SendEmail.scala
│ │ │ ├── model
│ │ │ ├── snippet
│ │ │ │ ├── Animals.scala
│ │ │ │ ├── Calculator.scala
│ │ │ │ ├── EmailSnippet.scala
│ │ │ │ ├── HelloWorld.scala
│ │ │ │ ├── Inner.scala
│ │ │ │ ├── ListUser.scala
│ │ │ │ ├── Localization.scala
│ │ │ │ ├── Outer.scala
│ │ │ │ └── Table.scala
│ │ │ └── view
│ │ └── webapp
│ │ ├── WEB-INF
│ │ │ └── web.xml
│ │ ├── contacts
│ │ │ ├── create.html
│ │ │ ├── delete.html
│ │ │ ├── edit.html
│ │ │ ├── list.html
│ │ │ └── view.html
│ │ ├── images
│ │ │ └── ajax-loader.gif
│ │ ├── index.html
│ │ ├── send.html
│ │ ├── static
│ │ │ └── index.html
│ │ └── templates-hidden
│ │ ├── default.html
│ │ └── wizard-all.html
│ └── test
│ ├── resources
│ │ └── logback-test.xml
│ └── scala
│ ├── RunWebApp.scala
│ └── code
│ └── snippet
│ └── AnimalsSpec.scala
└── target
├── resolution-cache
│ ├── net.liftweb
│ │ └── lift-2-6-starter-template_2.11
│ │ └── 0.0.4
│ │ ├── resolved.xml.properties
│ │ └── resolved.xml.xml
│ └── reports
│ ├── ivy-report.css
│ ├── ivy-report.xsl
│ ├── net.liftweb-lift-2-6-starter-template_2.11-compile-internal.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-compile.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-container.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-docs.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-optional.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-plugin.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-pom.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-provided.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-runtime-internal.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-runtime.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-scala-tool.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-sources.xml
│ ├── net.liftweb-lift-2-6-starter-template_2.11-test-internal.xml
│ └── net.liftweb-lift-2-6-starter-template_2.11-test.xml
├── scala-2.11
│ ├── classes
│ │ ├── bootstrap
│ │ │ └── liftweb
│ │ │ ├── Boot$$anonfun$1.class
│ │ │ ├── Boot$$anonfun$10.class
│ │ │ ├── Boot$$anonfun$11.class
│ │ │ ├── Boot$$anonfun$12.class
│ │ │ ├── Boot$$anonfun$13.class
│ │ │ ├── Boot$$anonfun$14.class
│ │ │ ├── Boot$$anonfun$15.class
│ │ │ ├── Boot$$anonfun$2$$anonfun$apply$mcZ$sp$1.class
│ │ │ ├── Boot$$anonfun$2$$anonfun$apply$mcZ$sp$2.class
│ │ │ ├── Boot$$anonfun$2.class
│ │ │ ├── Boot$$anonfun$3.class
│ │ │ ├── Boot$$anonfun$4.class
│ │ │ ├── Boot$$anonfun$5.class
│ │ │ ├── Boot$$anonfun$6.class
│ │ │ ├── Boot$$anonfun$7.class
│ │ │ ├── Boot$$anonfun$8.class
│ │ │ ├── Boot$$anonfun$9.class
│ │ │ ├── Boot$$anonfun$boot$1.class
│ │ │ ├── Boot$$anonfun$boot$2.class
│ │ │ ├── Boot$$anonfun$boot$3.class
│ │ │ ├── Boot$$anonfun$configureMailer$1$$anonfun$apply$1$$anon$1.class
│ │ │ ├── Boot$$anonfun$configureMailer$1$$anonfun$apply$1.class
│ │ │ ├── Boot$$anonfun$configureMailer$1.class
│ │ │ └── Boot.class
│ │ ├── code
│ │ │ ├── lib
│ │ │ │ ├── SendEmail$.class
│ │ │ │ └── SendEmail.class
│ │ │ └── snippet
│ │ │ ├── Animals$$anonfun$list$1$$anonfun$apply$1$$anonfun$apply$2.class
│ │ │ ├── Animals$$anonfun$list$1$$anonfun$apply$1$$anonfun$apply$3.class
│ │ │ ├── Animals$$anonfun$list$1$$anonfun$apply$1.class
│ │ │ ├── Animals$$anonfun$list$1.class
│ │ │ ├── Animals.class
│ │ │ ├── Calculator$$anonfun$plus$1.class
│ │ │ ├── Calculator.class
│ │ │ ├── EmailSnippet$$anonfun$sendEmail$1$$anonfun$apply$1.class
│ │ │ ├── EmailSnippet$$anonfun$sendEmail$1.class
│ │ │ ├── EmailSnippet$$anonfun$sendNow$1.class
│ │ │ ├── EmailSnippet.class
│ │ │ ├── HelloWorld$$anonfun$howdy$1.class
│ │ │ ├── HelloWorld.class
│ │ │ ├── Inner$$anonfun$logged$1.class
│ │ │ ├── Inner$$anonfun$nonlogged$1.class
│ │ │ ├── Inner.class
│ │ │ ├── ListUser$$anonfun$list$1.class
│ │ │ ├── ListUser$$anonfun$list$2$$anonfun$apply$1.class
│ │ │ ├── ListUser$$anonfun$list$2.class
│ │ │ ├── ListUser$$anonfun$log$1.class
│ │ │ ├── ListUser$$anonfun$log$2.class
│ │ │ ├── ListUser$$anonfun$log$3.class
│ │ │ ├── ListUser.class
│ │ │ ├── Localization$$anonfun$dynamic$1.class
│ │ │ ├── Localization.class
│ │ │ ├── Outer$$anonfun$1.class
│ │ │ ├── Outer$$anonfun$choose$1.class
│ │ │ ├── Outer$$anonfun$choose$2.class
│ │ │ ├── Outer.class
│ │ │ ├── Table$$anonfun$1$$anonfun$apply$1.class
│ │ │ ├── Table$$anonfun$1.class
│ │ │ ├── Table$$anonfun$dynamic$1.class
│ │ │ ├── Table$$anonfun$dynamic$2.class
│ │ │ ├── Table$$anonfun$dynamic$3$$anonfun$apply$2$$anonfun$apply$3.class
│ │ │ ├── Table$$anonfun$dynamic$3$$anonfun$apply$2$$anonfun$apply$4.class
│ │ │ ├── Table$$anonfun$dynamic$3$$anonfun$apply$2.class
│ │ │ ├── Table$$anonfun$dynamic$3.class
│ │ │ └── Table.class
│ │ ├── logback.xml
│ │ ├── props
│ │ │ └── default.props
│ │ ├── resources.properties
│ │ ├── resources_de.properties
│ │ └── resources_fr_FR.properties
│ └── test-classes
│ ├── RunWebApp$.class
│ ├── RunWebApp$delayedInit$body.class
│ ├── RunWebApp.class
│ ├── WEB-INF
│ │ └── web.xml
│ ├── code
│ │ └── snippet
│ │ ├── AnimalsSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$2.class
│ │ ├── AnimalsSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$3.class
│ │ ├── AnimalsSpec$$anonfun$1$$anonfun$apply$1.class
│ │ ├── AnimalsSpec$$anonfun$1$$anonfun$apply$4$$anonfun$apply$5.class
│ │ ├── AnimalsSpec$$anonfun$1$$anonfun$apply$4$$anonfun$apply$6.class
│ │ ├── AnimalsSpec$$anonfun$1$$anonfun$apply$4.class
│ │ ├── AnimalsSpec$$anonfun$1.class
│ │ └── AnimalsSpec.class
│ ├── contacts
│ │ ├── create.html
│ │ ├── delete.html
│ │ ├── edit.html
│ │ ├── list.html
│ │ └── view.html
│ ├── images
│ │ └── ajax-loader.gif
│ ├── index.html
│ ├── logback-test.xml
│ ├── send.html
│ ├── static
│ │ └── index.html
│ └── templates-hidden
│ ├── default.html
│ └── wizard-all.html
├── specs2-reports
│ └── stats
│ └── code.snippet.AnimalsSpec.stats
└── streams
├── $global
│ ├── $global
│ │ └── $global
│ │ └── out
│ ├── ivyConfiguration
│ │ └── $global
│ │ └── out
│ ├── ivySbt
│ │ └── $global
│ │ └── out
│ ├── projectDescriptors
│ │ └── $global
│ │ └── out
│ └── update
│ └── $global
│ ├── inputs
│ ├── out
│ └── output
├── compile
│ ├── $global
│ │ └── $global
│ │ └── data
│ ├── compile
│ │ └── $global
│ │ ├── export
│ │ └── out
│ ├── copyResources
│ │ └── $global
│ │ ├── copy-resources
│ │ └── out
│ ├── dependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── exportedProducts
│ │ └── $global
│ │ └── export
│ ├── externalDependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── incCompileSetup
│ │ └── $global
│ │ └── inc_compile
│ ├── internalDependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── managedClasspath
│ │ └── $global
│ │ └── export
│ ├── unmanagedClasspath
│ │ └── $global
│ │ └── export
│ └── unmanagedJars
│ └── $global
│ └── export
├── container
│ └── $global
│ └── $global
│ └── data
├── runtime
│ ├── dependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── exportedProducts
│ │ └── $global
│ │ └── export
│ ├── externalDependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── fullClasspath
│ │ └── $global
│ │ └── export
│ ├── internalDependencyClasspath
│ │ └── $global
│ │ └── export
│ ├── managedClasspath
│ │ └── $global
│ │ └── export
│ ├── unmanagedClasspath
│ │ └── $global
│ │ └── export
│ └── unmanagedJars
│ └── $global
│ └── export
└── test
├── $global
│ └── $global
│ └── data
├── compile
│ └── $global
│ ├── export
│ └── out
├── copyResources
│ └── $global
│ ├── copy-resources
│ └── out
├── definedTests
│ └── $global
│ └── out
├── dependencyClasspath
│ └── $global
│ └── export
├── exportedProducts
│ └── $global
│ └── export
├── externalDependencyClasspath
│ └── $global
│ └── export
├── fullClasspath
│ └── $global
│ └── export
├── incCompileSetup
│ └── $global
│ └── inc_compile
├── internalDependencyClasspath
│ └── $global
│ └── export
├── loadedTestFrameworks
│ └── $global
│ └── out
├── managedClasspath
│ └── $global
│ └── export
├── test
│ ├── $global
│ │ ├── out
│ │ └── succeeded_tests
│ └── isModule=false\ name=code.snippet.AnimalsSpec
│ └── out
├── unmanagedClasspath
│ └── $global
│ └── export
└── unmanagedJars
└── $global
└── export
204 directories, 304 files
Not sitting with a compiler at the moment, but should you not use
new
as it is a class and not an object?Should be
Or you can change
class Animals
intoobject Animals
.