У меня есть контроллер в Grails, который возвращает ответ в JSON.Как сравнить JSON в тесте grails
Я написал тест, который работает примерно как этот
test(){
def expectedResponse=JSON.parse('[{"username":"user","startDate":"2010-11-30"}]')
...
def actualResponse=JSON.parse(response.text)
println "Expecting: ${expectedResponse.toString()}"
println "Actual: ${actualResponse.toString()}"
assertEquals(expectedResponse.toString(), actualResponse.toString())
...
}
Это работает, как ожидалось
Expecting: [{"username":"user","startDate":"2010-11-30"}]
Actual: [{"username":"user","startDate":"2010-11-30"}]
Однако, мне было интересно, если есть лучший способ сделать это, не прибегая к сравнение строк. Возможно, что-то, что может оставить мне гибкость, чтобы иметь возможность добавлять атрибуты в ответ, не отменяя мой тестовый пример?
Я мог бы построить это сам, но я бы ожидал, что какое-то сравнение JSON будет встроено в язык.
Обновление: Я пробовал делать это напрямую, без toString и имел непоследовательные результаты, не совсем уверен, почему, он работал на одном этапе, а затем внезапно получил это. Я не вижу никаких изменений кода, которые я сделал, что вызвало бы разницу
groovy.lang.MissingMethodException: No signature of method: com.siggysale.MainControllerTests.assertEquals() is applicable for argument types: (org.codehaus.groovy.grails.web.json.JSONArray, org.codehaus.groovy.grails.web.json.JSONArray) values: [[], []]
Рассуждая об этом снова, я думаю, что сравнение строк, вероятно, хороший подход по большей части –
Вы просто должны быть в состоянии сравнить '' expectedResponse' и actualResponse', нет? –
@tim_yates очень странно, в первый раз я пробовал, что это не сработало, казалось, жаловался на то, что не смог утвердитьEquals два массива (из памяти) ... Теперь я просто попробовал это снова, забрав toString() компонент в этом образце, и он работал ... не знаю, что произошло в первый раз –