【问题标题】:Ruby on Rails - minitest assert_select test passes with any parsed JSON, even when it should failRuby on Rails - minitest assert_select 测试通过任何解析的 JSON,即使它应该失败
【发布时间】:2018-12-29 01:05:59
【问题描述】:

我似乎无法让我的测试因虚假数据而失败,所以这告诉我我没有正确测试我的实际数据。我的视图显示解析的 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 有问题吗?

【问题讨论】:

  • 真的不清楚你想用{ "status": "SUCCESS" }做什么。你想匹配<p status="success">之类的东西吗?那不是有效的 HTML。需要明确的是,JSON 与 assert_select 无关,后者用于处理 HTML。

标签: ruby-on-rails json ruby assert minitest


【解决方案1】:

这里使用解析的 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>

    当给定一个哈希作为它的第二个参数时,它理解的选项是:

    :text - 将选择范围缩小到具有此文本值的元素 (字符串或正则表达式)。

    :html - 将选择范围缩小到具有此 HTML 内容的元素 (字符串或正则表达式)。

    :count - 如果选定元素的数量相等,则断言为真 到这个值。

    :minimum - 如果选定元素的数量为 至少这个值。

    :maximum - 如果选定元素的数量为 最多这个值。

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

    是的,这应该通过,原因相同:您传递了一个被忽略的随机未知选项,并且发现 <p> 匹配。

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

    如上所述,是的,这应该通过,“bestBearType”不是assert_select 的有效选项。

  • assert_select 'p', expected_data # fails

    这个应该失败,因为你给它的第二个参数是一个字符串,匹配如下:

    如果至少一个元素的文本值与字符串或正则表达式匹配,则断言为真。

    您的输出中没有与字符串 "{\"status\": \"SUCCESS\"}" 匹配的 <p> 标记。

有关完整说明和一些有用示例,请参阅 the documentation

【讨论】:

  • 我看到我没有清楚地表达我为什么要在页面上寻找解析的 JSON 的意图,所以我在帖子中添加了这个:My view displays a parsed JSON response (which I've verified in the browser), but I can't seem to verify this in a test. 你的回答帮助我理解了assert_select更好,并帮助我意识到我在解析的 JSON 中定位了错误的键。因为assert_select 没有与我正在检查的密钥相对应的option,所以我得到了pass。因此,巧合的是,我解析的 JSON 被 assert_select 解释为带有选项的哈希。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多