如何使用specs2框架在liftweb中测试代码段代码

时间:2013-09-30 07:44:15

标签: scala lift specs2

我正在尝试编写一个测试代码段的Specs2测试用例。  我的代码片段看起来像这样:

class RegisterTest extends Specification {
  val testurl = "http:/html/register?username=liftvalues"
  val testSession = MockWeb.testS(testurl) { S.session }
  def inSession[T](a: => T): T = S.initIfUninitted(testSession) { a }
  def is = s2"""   example1 $e1   """
  val html = <form><input name="username" value="liftvalues"></input></form>
  def e1 = {
    inSession{
      register(html)
    }
  }  
  def register(in:NodeSeq):Result = {
      val username = S.param("username") //Here we are getting "Empty Value" for the S object. 
      username === "liftvalues"  and  UserSchemaTest.registerData("data")
  }
}

此测试失败,因为S.paramEmpty。如何为代码段提供模拟请求?

到目前为止,我已查看Unit Testing Snippets With A Logged In UserMocking HTTP Requests,但我不明白如何实现我的目标。

1 个答案:

答案 0 :(得分:1)

您的代码原则上甚至不应该编译,因为testSession会返回Box[LiftSession]S.initIfUninitted需要一个未装箱的LiftSession。此外,甚至不需要这样做,因为MockWeb.testS会为您初始化会话see here

我对Specs2并不是很熟悉,但我相信这样的事情应该做你想做的事情,或者至少让你接近:

class RegisterTest extends Specification {

  val testurl = "http://html/register?username=liftvalues"

  val html = <form><input name="username" value="liftvalues"></input></form>
  def e1 = register(html)  

  def register(in:NodeSeq):Boolean = {
      val username = S.param("username") //Here we are getting "Empty Value" for the S object. 
      username === "liftvalues" and  UserSchemaTest.registerData("data")
  }

  MockWeb.testS(testurl) {
    s2"""   example1 $e1   """
  }

}

MockWeb.testS块中调用的所有内容都应该可以访问您的会话和请求 - 因此您可以正常进行方法调用。

此外,您的测试也看起来不对,s2"""可能会抛出错误。但是,我不完全确定你想要它做什么,所以我无法提出替代方案。