测试 Rails 辅助方法 returns HTML,与纯文本进行比较

Testing a Rails helper method that returns HTML, compare with plain text

我有这个 Rails 辅助方法,其中 returns 带有链接的文本:

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 的确切细节,我更愿意在辅助规范而不是 feature/browser 规范中执行此操作,因为它要快得多。

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

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?

我知道怎么做了!我使用 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: []) 方法,但据我所知这种方法更简单。

当我想匹配任何复杂标记(例如 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./

这切入了您正在测试的内容的本质,并且对标记的变化非常有弹性,专注于内容。