Сопоставьте ответ json с шаблоном в файле fixture для тестирования со спецификацией

#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.