Hi,

I am working at the moment on a small lift demo app and I've added
some enhancements to specs in order to ease the testing inside a
session.
To use those functionalities, you need specs-1.6.1-SNAPSHOT (http://
www.scala-tools.org/repo-snapshots/org/scala-tools/testing/specs/1.6.1-SNAPSHOT).

Here are the specification and traits that I use to test the JPA
requests to save a User in the database:

// First I create Mocks for the lift session
import javax.servlet.http._
import net.liftweb.http.{ S, Req, LiftSession }
import org.specs.mock.Mockito

trait MockRequest extends Mockito { this: Specification =>
  var request = mock[Req]
  var httpRequest = mock[HttpServletRequest]
  var session = mock[LiftSession]

  def createMocks: Unit = {
     request = mock[Req]
     httpRequest = mock[HttpServletRequest]
     session = mock[LiftSession]
     request.request returns httpRequest
  }

   // this method can be used to executed any action inside a mocked
session
  def inSession(f: =>Any) {  S.init(request, session) { f }  }

   def unsetParameter(name: String) { request.param(name) returns
None }
   def setParameter(name: String, value: String)  { request.param
(name) returns Some(value) }
}

// Context creation for the specification
//
// This "Specification context" specifies the User table must be
cleaned up before each example.
//  It also makes sure that the example expectations are executed in a
mocked session
// see 
http://code.google.com/p/specs/wiki/DeclareSpecifications#Specification_context_(_from_1.6.1_)
for more information

object DatabaseContext extends Specification with Contexts with
MockRequest {
  val setup = new SpecContext {
    beforeExample(inSession(Users.createQuery("delete
User").executeUpdate)) // delete the User table before each example
    aroundExpectations(inSession(_))  // execute each example inside a
mocked session
  }
}

// and finally the specification itself

import org.specs._
import org.specs.specification._

class UserSpec extends SpecificationWithJUnit with MockRequest with
Contexts {

  DatabaseContext.setup(this) // set the specification context on this
specification

  "A Users repository" can {
    "create a user" in {
       val eric = User("etorreborre", "password", "Eric")
       Users.mergeAndFlush(eric)     // the Users object is a LocalEMF
with RequestVarEM so it needs a session
       Users.find(classOf[User], "etorreborre") must_== Some(eric)
    }
  }
   "A Users repository" should {
     "throw an exception if the user name has a length < 5" in {
        Users.merge(User("e", "password", "Eric")) must throwAn
[Exception]
     }
  }
}

I hope this helps too, please ask if you have any questions.

Eric.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to