我有一个帮助方法,我用它来使用正则表达式验证电话号码。
object RegexValidator {
//Does not match: (+447222)555555 | +44(7222)555555 | (0722) 5555555 #22
def phoneNumber = text verifying pattern(getConf("regex.phoneNumber").r, error="")
}
此验证用于验证控制器中的电话号码:
val adminForm = Form(
mapping(
"firstName" -> nonEmptyText,
"lastName" -> nonEmptyText,
"phoneNo" -> phoneNumber
)(AdministratorDetails.apply)(AdministratorDetails.unapply)
验证工作正常。但是,我想在我的播放应用程序中编写一个Scala测试来验证phoneNumber方法。我也希望传递一些测试数据(比如参数化测试)。
有人可以帮我提供示例代码吗?我已经在Play文档中查看过Scala测试文档,但无法实现这一目标。
答案 0 :(得分:0)
由于我无法自行说明您自己重新构建示例的范围,我将提供一个测试Forms.nonEmptyText
的示例,作为您的{{ 1}}应该像def phoneNumber
一样返回Mapping[String]
。
nonEmptyText
我们可以在测试中使用Mapping[T]
函数:
bind
它接受类似bind(data: Map[String, String]): Either[Seq[FormError], T]
的表单映射,并返回错误或包含在Map("email" -> "joe@example.com")
类型中的验证值(必须是Either
或Left
,使用Right
表示错误,Left
表示成功的惯例。
因此,我要重新实现您的功能,暂时将其别名化为Right
:
nonEmptyText
现在让我们尝试绑定一些表单数据:
def phoneNumber: Mapping[String] = Forms.nonEmptyText
这评估为phoneNumber.bind(Map("" -> "911"))
,这是我们的成功案例。现在一些不好的数据:
Right("911")
评估为phoneNumber.bind(Map("" -> ""))
,表示失败。
对于实际测试,您可能只关心验证的成功或失败,因此我们可以围绕Left(List(FormError("",error.required,WrappedArray())))
类型建立断言:
Either
我应该注意,在phoneNumber.bind(Map("" -> "911")).isRight should be (true)
phoneNumber.bind(Map("" -> "")).isLeft should be (true)
映射之外,与Form
关联的密钥是空字符串,因此是Mapping[String]
个密钥的空字符串。从这里开始,您只需要将Map
替换为您自己的实现,我相信您可以从我的样本中制作真实的测试用例。