RSpec: hash_incinding не работает, как я ожидал - PullRequest
0 голосов
/ 09 ноября 2019

Рассмотрим следующий ответ json:

{
  "data": {
    "someFunction": null
  },
  "errors": [
    {
      "message": "Email was already confirmed, please try signing in",
      "locations": [
        {
          "line": 9,
          "column": 2
        }
      ],
      "path": [
        "someFunction"
      ],
      "extensions": {
        "code": "USER_ERROR"
      }
    }
  ]
}

Сейчас в тесте я ожидаю, что следующий ответ будет правильным:

expect(json_response[:errors]).to contain_exactly(
  hash_including(
    message: "Email was already confirmed, please try signing in.",
    extensions: { code: 'USER_ERROR' }
  )
)

Приведенный выше ответ должен быть действительным, кромечто мои тесты говорят, что это не так:

expected collection contained:  [hash_including(:message=>"Email was already confirmed, please try signing in.", :extensions=>{:code=>"USER_ERROR"})]
actual collection contained:    [{:extensions=>{:code=>"USER_ERROR"}, :locations=>[{:column=>9, :line=>2}], :message=>"Email was already confirmed, please try signing in", :path=>["someFunction"]}]
the missing elements were:      [hash_including(:message=>"Email was already confirmed, please try signing in.", :extensions=>{:code=>"USER_ERROR"})]
the extra elements were:        [{:extensions=>{:code=>"USER_ERROR"}, :locations=>[{:column=>9, :line=>2}], :message=>"Email was already confirmed, please try signing in", :path=>["someFunction"]}]

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Проблема в том, что вы делаете так много в тесте (и вам не нужно вкладывать совпадения)

Поскольку Matrease_exactly возвращает true или ошибку.

Итак, попытка предложенияне делать сложного теста и стараться избегать более чем одного ожидания на одном тесте

  it 'includes data and errors' do
    expect(json_response.keys).to contain_exactly(:data, :errors)
  end

  it 'Email error has message' do
    expect(json_response[:errors][0][:message]).to eq 'Email was already confirmed, please try signing in'
  end

  it 'Email error has code' do
    expect(json_response[:errors][0][:extensions]).to eql(code: 'USER_ERROR')
  end

Это должно сработать

0 голосов
/ 09 ноября 2019

Используя один из тестов Орасио, я смог определить, ожидал ли я какой-то период. Отказ от основной функции Rspec и отказ от ее использования - не то решение, которое я хотел. Тем не менее, это был опыт обучения для меня, и, надеюсь, любой другой, кто сталкивается с этим вопросом, задается вопросом, что они сделали неправильно, они увидят простую ошибку, связав вместе contain_exactly и hash_including вместе, что может привести к тому, что вывод вашей ошибки обманет вас. думая, что в действительности вы делаете что-то не так, в действительности вы, вероятно, допустили простую ошибку.

Эта проверка здравомыслия:

expect(json_response[:errors][0][:message]).to eq 'Email was already confirmed, please try signing in'

В результате я обнаружил свою простую ошибку:

 expected: "Email was already confirmed, please try signing in."
      got: "Email was already confirmed, please try signing in"
...