2015-11-15 29 views
0

比较嵌套的JSON-阵列播放JSON和Specs2我可以匹配JSON的机构是这样的:玩JSON - 与Specs2

contentAsJson(res) must equalTo(responseBody) 

是否有一个方法可行忽略JSON阵列和订单(递归)而不是平等的JSON数组像他们是集?

回答

1

这涉及到一些工作,具体取决于您希望故障信息有多好。你可以做这样的事情

import org.specs2._ 
import execute._ 
import matcher._ 
import play.api.libs.json._ 

trait JsValueMatchers extends MustMatchers { 
    def beEqualj(expected: JsValue): Matcher[JsValue] = { actual: JsValue => 
    (actual, expected) match { 
     case (JsArray(as), JsArray(es)) => 
     asPair(as must contain(allOf(es.map(beEqualj):_*)).exactly) 

     case (JsObject(as), JsObject(es)) => 
     asPair(as must contain(allOf(es.toList.map(pairEqualj):_*)).exactly.inOrder) 

     case (JsNull, JsNull) => 
     (true, "ko") 

     case (JsBoolean(a), JsBoolean(e)) => 
     (a == e, s"ko: $a is not equal to $e") 

     case (JsString(a), JsString(e)) => 
     (a == e, s"ko: $a is not equal to $e") 

     case (JsNumber(a), JsNumber(e)) => 
     (a == e, s"ko: $a is not equal to $e") 

     case _ => 
     (false, s"$actual and $expected don't have the same type") 
    } 
    } 

    def pairEqualj(expected: (String, JsValue)): Matcher[(String, JsValue)] = { actual: (String, JsValue) => 
    val (key, value) = actual 
    val result = (key must_== expected._1) and 
     (value must beEqualj(expected._2)) 
    asPair(result) 
    } 

    def asPair[R : AsResult](r: R): (Boolean, String) = { 
    val result = AsResult(r) 
    (result.isSuccess, result.message) 
    } 
} 

object JsValueMatchers 
+0

非常感谢。看起来很有希望。我试图编译时遇到1错误: ''found:Iterable [org.specs2.matcher.Matcher [(String,play.api.libs.json.JsValue)]] required:Seq [org.specs2 .matcher.ValueCheck [?]] 从stdout中读取:asPair(必须包含(allOf(es.map(pairEqualj):_ *))。exactly.inOrder)''' –

+0

对不起,我修正了编译错误现在。 – Eric