测试返回 HTML 的 Rails 帮助程序方法,与纯文本进行比较



我有这个 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?

我想出了怎么做!我使用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./

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

最新更新