2016-06-08 68 views
0

我希望为shipmentNumberValidator方法编写单元测试,其中Readsplay.api.libs.json.Reads。我该怎么做?如何为Play Framework JSON阅读器编写单元测试

object Validator { 
    def shipmentNumberValidator(): Reads[String] = 
     Reads.filter(ValidationError(ErrorConstants.BAD_SHIPMENT_NUMBER))(_.matches(BarcodePatterns.ShipmentNumber)) 
} 

单元测试应该传递给它一个装运编号,并且该方法返回任一成功装运数或错误消息,如果装运编号格式不匹配。我不知道如何将值传递给此方法。

的方法通常是在配套使用的对象隐读,如:

object ShipmentOrder { 
    implicit val shipmentOrderReads: Reads[ShipmentOrder] = (
    (JsPath \ "id").read[String](Validator.missingFieldValidator("id") keepAnd Validator.shipmentNumberValidator())(ShipmentOrder.apply _) 
} 

回答

2

根据test framework您使用(如specs2),你可以测试预期如下:

  • 做一个Json.parse("{expectedJson}") must be JsResult(expectedInstance)
  • 做一个Json.parse("{unexpectedJson}") must be JsError(_)

使用规格2:

import play.api.libs.json._ 

"JSON" should { 
    "be successfully parsed when expected" in { 
    Json.parse("""{"expected":"json"}""") must beLike[JsResult[ShipmentOrder]] { 
     case JsSuccess(parsed, _) => 
     parsed must_== expectedShipmentOrder 
    } 
    } 

    "fail to be parsed if expected" in { 
    Json.parse("""{"unexpected":"json"}""") must beLike[JsResult[ShipmentOrder]] { 
     case JsError(details) => 
     ok // possible check `details` 
    } 
    } 
} 
+0

嗯,有没有方法来测试'shipmentNumberValidator'而不使用ShipmentOrder?原因是验证者不仅被ShipmentOrder使用,还有几个不同类使用的验证器。 – Robo

+0

不明确。每个类型'T'只有一个'Reads'。 – cchantep

相关问题