Ruby on Rails - минимальный тест assert_select проходит с любым проанализированным JSON, даже если он не пройден - PullRequest
0 голосов
/ 29 декабря 2018

Я не могу заставить мой тест провалиться с фальшивыми данными, и это говорит мне, что я не проверяю свои реальные данные должным образом.В моем представлении отображается проанализированный JSON-ответ (который я проверил в браузере), но я не могу проверить это в тесте.

# Arrange
account = accounts(:good_account) # from fixture
expected_data = { "status": "SUCCESS" }.to_json
phony_data = { "bestBearType": "BLACK" }.to_json

# Act
get some_show_url(account.id)

# Assert
assert_select 'p', JSON.parse(expected_data) # passes
assert_select 'p', JSON.parse(phony_data) # passes (shouldn't)
assert_select 'p', { "bestBearType": "BLACK" } # passes (shouldn't)
assert_select 'p', expected_data # fails

Я действительно почесал голову относительно того, какфальшивые данные могут передаваться.Это почти как если бы у меня просто assert_select 'p' без ожидаемого значения, которое следует.Есть ли проблема с использованием проанализированного JSON здесь?

1 Ответ

0 голосов
/ 29 декабря 2018

Есть ли проблема с использованием проанализированного JSON здесь?

Вы неправильно используете assert_select, который не имеет ничего общего с JSON, он предназначен для выбора элементов HTML из вывода вашего сервера.Я не могу сказать, каково ваше намерение, но вы не можете запросить проанализированный (или непарсированный) JSON к assert_select или отправить JSON в качестве любого из его аргументов.

В каждом из четырех ваших случаев,поведение assert_select соответствует ожидаемому:

  • assert_select 'p', JSON.parse(expected_data) # passes

    Вы передали ему неизвестный параметр, "status".Это не опция, поддерживаемая assert_select, поэтому в действительности вы запускаете assert_select 'p', который проходит, потому что находит <p>.

    Когда ему дан хэш в качестве второго аргумента, опции, которые он понимаетare:

    : text - сузить выделение до элементов с этим текстовым значением (строка или регулярное выражение).

    : html - сузить выделение до элементов с этим HTML-содержимым (string или regexp).

    : count - утверждение верно, если число выбранных элементов равно этому значению.

    : минимум - утверждение верно, если количество выбранных элементов не меньшеэто значение.

    : максимум - утверждение верно, если число выбранных элементов не превышает это значение.

  • assert_select 'p', JSON.parse(phony_data) # passes (shouldn't)

    Да, это должно пройти, по той же причине: вы передаете случайную неизвестную опцию, которая игнорируется, и найдено <p> для поиска.

  • assert_select 'p', { "bestBearType": "BLACK" } # passes (shouldn't)

    Как и выше, да, это должно пройти, "bestBПараметр earType "недопустим для assert_select.

  • assert_select 'p', expected_data # fails

    Этот должен дать сбой, посколькувторой аргумент, который вы указываете, является строкой, которая соответствует следующему:

    Утверждение истинно, если текстовое значение хотя бы одного элемента соответствует строке или регулярному выражению.

    В вашем выводе нет тега <p>, который соответствует строке "{\"status\": \"SUCCESS\"}".

См. документацию для полного описания и некоторых полезныхпримеры.

...