Как проверить атрибуты объекта с помощью Rspec - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь проверить вывод reponse.json метода show в контроллере:

describe "#show" do
 let!(:animal){create(:animal, name:"Cat"}
 let(:params) {{id: animal.id}}

 subject {get :show, params: params}

 context "when animal campaign exists" do
  it "should have the expected keys" do
    subject

    response_json = JSON.parse(response.body)
    expected_keys = [
      "animal_name",
      "id", 
      ]
      expect(response_json).to include(*expected_keys)

Ожидаемый объект, который выводится, не сравнивается с expected_keys:

  expected {"animal_name" => "Cat, "animal_id" => 6999} 
  Diff:
       @@ -1,23 +1,23 @@
       -["animal_name",
       - "animal_id"]

Как я могу проверить на expected_keys?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

В то время как вы можете использовать:

expect(response_json.keys).to include [""animal_name", "id"]

Сообщение об ошибке будет очень загадочным c, поскольку оно ничего не говорит нам о том, что вы на самом деле пытаетесь проверить.

Немного лучше это:

expect(response_json).to have_key "animal_name"
expect(response_json).to have_key "animal_id"

Но вы действительно можете проверить правильность JSON по сравнению с моделью:

expect(response_json).to include({
  "animal_name" => "Cat"
  "animal_id" => animal.id
})
0 голосов
/ 12 февраля 2020

Это похоже на странный тест для написания, но вы можете просто отобразить ключи из response.body.

Я не знаю, как выглядит ваш контроллер, но я предполагаю, что есть некоторый реляционный что происходит, что предвосхищает animal_ ваш ответ.

Разве лучшим тестом не будет просто что-то вроде этого?

describe 'GET show' do
  it 'will show an animal campaign' do
    get :show, params: { id: animal.id }
    expect(response.parsed_body).to include 'animal_name'
  end
end

Судя по вашему выводу, который должен пройти, хотя я ' Я не совсем уверен, что именно вы тестируете.

...