#ruby-on-rails #rspec #rspec-rails #fixtures
#ruby-on-rails #rspec #rspec-rails #приспособления
Вопрос:
мы внедрили файлы fixture для наших приемочных тестов API. Он отлично работает с запросами. Мы загружаем файл с запросом и используем его для запроса в тестах. Тем не менее, я хочу реализовать то же самое с ответами. Я хочу проверить, что полученный нами обработанный ответ json соответствует шаблону файла fixture. До сих пор я пробовал это: файл fixture fixtures/files/pauses/response.json:
{
"data": {
"id": {
"type": "integer"
},
"type": "pause",
"attributes": {
"working_session_id": {
"type": "integer"
},
"starts_at": {
"type": "string"
},
"ends_at": {
"type": "integer"
},
"created_at": {
"type": "integer"
},
"updated_at": {
"type": "integer"
},
"start_signature_id": {
"type": "integer"
},
"end_signature_id": {
"type": "integer"
},
"secure_id": {
"type": "integer"
},
"created_by": {
"type": "integer"
}
}
},
"meta": {
"git_commit": {
"type": "string"
}
}
Это часть теста api, отправляющего запрос на обновление в update_spec.rb
let(:response) { parsed_file_fixture("pauses/response.json") }
example "Update a pause" do
do_request(request)
parsed_json = JSON.parse(response_body)
assert_equal parsed_json, response
expect(status).to eq 200
end
И затем это журнал ошибок при запуске rspec
1) Pauses /api/v3/workspaces/:workspace_id/time_trackings/:time_tracking_id/pauses/:pause_id Update PATCH Update a pause Authenticated as admin Update a time tracking
Failure/Error: assert_match parsed_json, response
Minitest::Assertion:
Expected {"data"=>{"id"=>"62", "type"=>"pause", "attributes"=>{"working_session_id"=>194, "starts_at"=>"2021-02-05T17:48:06 01:00", "ends_at"=>"2021-02-05T19:13:06 01:00", "created_at"=>"2021-02-05T19:43:19 01:00", "updated_at"=>"2021-02-05T19:43:20 01:00", "start_signature_id"=>nil, "end_signature_id"=>nil, "secure_id"=>"65389b5130cff0ab804cc9ff87f5fd5d", "created_by"=>"browser-stamps"}}, "meta"=>{"git_commit"=>"df02dfa12f70a823bbdcbc1c86ff2357c997d488"}} to match {"data"=>{"id"=>{"type"=>"integer"}, "type"=>"pause", "attributes"=>{"working_session_id"=>{"type"=>"integer"}, "starts_at"=>{"type"=>"string"}, "ends_at"=>{"type"=>"integer"}, "created_at"=>{"type"=>"integer"}, "updated_at"=>{"type"=>"integer"}, "start_signature_id"=>{"type"=>"integer"}, "end_signature_id"=>{"type"=>"integer"}, "secure_id"=>{"type"=>"integer"}, "created_by"=>{"type"=>"integer"}}}, "meta"=>{"git_commit"=>{"type"=>"string"}}}.
Теперь мой вопрос: возможно ли таким образом использовать файлы fixture и допускать нестатические значения и просто проверять соответствие типу атрибута? Некоторые атрибуты генерируются случайным образом и каждый раз отличаются, а идентификаторы также меняются. Вот почему я не могу использовать статические значения в этом случае.
Ответ №1:
Вы можете использовать драгоценный камень json_matchers для проверки каждого ответа на соответствие схеме JSON. С помощью схемы JSON вы можете определить структуру для каждого ответа и иметь проверки для каждого ключа и значения. (Ознакомьтесь с пониманием схемы JSON)
Существуют также генераторы схем JSON (см. Это ), которые вы можете использовать для создания схем JSON на основе ваших существующих ответов для использования с json_matchers
gem.