测试 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)中的特定文本时,我喜欢使用 match
或 include
,像这样:
expect(output).to include "#{user.username} added #{game.name} to their library."
或...
expect(output).to match /#{user.username} added #{game.name} to their library./
这切入了您正在测试的内容的本质,并且对标记的变化非常有弹性,专注于内容。
我有这个 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)中的特定文本时,我喜欢使用 match
或 include
,像这样:
expect(output).to include "#{user.username} added #{game.name} to their library."
或...
expect(output).to match /#{user.username} added #{game.name} to their library./
这切入了您正在测试的内容的本质,并且对标记的变化非常有弹性,专注于内容。