2015-11-15 8 views
0

с Play-Json и Specs2 я могу соответствовать JSon кузова, как это:Play Json - Сравнить вложенную JSon-массив с Specs2

contentAsJson(res) must equalTo(responseBody) 

Есть ли Possiblity игнорировать порядок (рекурсивно) для 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)]] требуется: Seq [org.specs2 .matcher.ValueCheck [?]] Чтение из stdout: asPair (как должно содержать (allOf (es.map (pairEqualj): _ *)). точно.inOrder) '' ' –

+0

К сожалению, я исправил ошибку компиляции Теперь. – Eric