我正在尝试编写一个测试代码段的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.param
为Empty
。如何为代码段提供模拟请求?
到目前为止,我已查看Unit Testing Snippets With A Logged In User 和Mocking HTTP Requests,但我不明白如何实现我的目标。
答案 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"""
可能会抛出错误。但是,我不完全确定你想要它做什么,所以我无法提出替代方案。