如何在Play框架中使用Scala Test测试辅助方法

时间:2014-06-12 11:44:34

标签: unit-testing playframework tdd scalatest

我有一个帮助方法,我用它来使用正则表达式验证电话号码。

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测试文档,但无法实现这一目标。

1 个答案:

答案 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")类型中的验证值(必须是EitherLeft,使用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替换为您自己的实现,我相信您可以从我的样本中制作真实的测试用例。