【问题标题】:Testing a Rails helper method that returns HTML, compare with plain text测试返回 HTML 的 Rails 辅助方法,与纯文本进行比较
【发布时间】:2019-08-20 03:07:42
【问题描述】:

我有这个 Rails 辅助方法,它返回带有链接的文本:

def add_to_library_event_text(event)
  user_link = link_to(event.user.username, user_path(event.user))
  game_link = link_to(event.game_purchase.game.name, game_path(event.game_purchase.game))

  return user_link + " added " + game_link + " to their library."
end

我想做的是为它编写一个规范,以确保它输出正确的文本。我不太关心 HTML 的确切细节,我更喜欢在帮助规范而不是功能/浏览器规范中这样做,因为它要快得多。

我已经有一个工作测试,它看起来像这样:

expect(helper.add_to_library_event_text(add_to_library_event)).to eq \
  "<a href=\"/users/#{user.username}\">#{user.username}</a> added <a href=\"/games/#{game.id}\">#{game.name}</a> to their library."

我希望有一些我还没有找到的方法可以让我从中删除 HTML,所以我可以写一个这样的比较:

expect(helper.add_to_library_event_text(add_to_library_event)).to eq \
  "#{user.username} added #{game.name} to their library."

RSpec/Rails 中有什么东西可以让我从中剥离 HTML 吗?

【问题讨论】:

    标签: ruby-on-rails ruby rspec helper


    【解决方案1】:

    我想出了如何做到这一点!我使用strip_tags 从输入字符串中去除 HTML。

    expect(
      strip_tags(helper.add_to_library_event_text(game_purchase_library_event))
    ).to eq "#{user.username} added #{game.name} to their library."
    

    https://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-strip_tags

    您也可以使用sanitize(html_string_goes_here, tags: []) 方法,但据我所知,这更简单。

    【讨论】:

      【解决方案2】:

      当我想匹配任何复杂标记(例如 HTML)中的特定文本时,我喜欢使用 matchinclude,如下所示:

      expect(output).to include "#{user.username} added #{game.name} to their library."
      

      或者...

      expect(output).to match /#{user.username} added #{game.name} to their library./
      

      这切入了您要测试的内容的本质,并且对标记的更改非常有弹性,专注于内容。

      【讨论】:

      • 有趣,我想知道这两个与 strip_tags 之间的性能差异是什么。
      • 性能在这里不是一个大问题。任何一种方法都是内存中的所有字符串操作,因此它的滚动速度比您看到的要快。您可以在一次带有数据库写入的测试中运行一百个这样的测试。也就是说,查找子字符串将比在条形标签中解析 HTML 更快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多