在生成的文本上编写测试

时间:2016-11-11 10:40:30

标签: ruby-on-rails ruby rspec tdd

我正在使用rails helper替换一段内容中的单词以添加工具提示。没问题,工作正常,但我想测试这个帮助器的确切输出,因为替换添加了一些不需要的格式,我发现很难真正测试这个帮助。

原始字符串

a piece of <a href="http://">content</a> that contains jargon1 to be replaced

我的助手用一些html替换jargon1来渲染工具提示

content.gsub!(/#{jargon.word}/i, get_node(jargon))

def get_node jargon
  <<-HTML
    <a href='#jargon-#{jargon.id}'
      class='jargon-tip'
      data-toggle='tooltip'
      data-placement='top'
      data-original-title='#{jargon.desc}'
      rel='help'>#{jargon.word}</a>
  HTML
end

带有注入的html

的字符串的结果
a piece of <a href="http://">content</a> that contains       <a href='#jargon-130'
    class='jargon-tip'
    data-toggle='tooltip'
    data-placement='top'
    data-original-title='desc for jargon 1'
    rel='help'>jargon1</a> 
    to be replaced

首先,that contains<a之间有7个空格,我希望html在结果中显示内联,但在我的代码中我喜欢它的格式如上,以保持其可读性。< / p>

我的最终目标是建立一个强大的测试,将解析后的字符串与预定义的字符串进行比较。现在我只测试一段字符串(expect(result).to include("data-original-title='desc for jargon 1'"))因为\ n的格式问题而且它将是一个脆弱的测试。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以使用:

def get_node jargon
  node=<<-HTML
    <a href='#jargon-#{jargon.id}'
      class='jargon-tip'
      data-toggle='tooltip'
      data-placement='top'
      data-original-title='#{jargon.desc}'
      rel='help'>#{jargon.word}</a>
  HTML
  node.strip.gsub(/\s+/, ' ')
end

这将删除字符串开头或结尾处的任何空格,并且它只用空格替换任何多个空格(例如换行符+缩进)。

您的字符串看起来像<a href='...' class=X data=Y></a>,这可能更容易测试。

答案 1 :(得分:0)

您应该使用Rails的视图助手以编程方式生成HTML。在您的特定情况下,它是link_to帮助程序:

def get_node(jargon)
  link_to(jargon.word, "#jargon-#{jargon.id}",
    class: 'jargon-tip',
    rel: 'help',
    data: {
      toggle: 'tooltip',
      placement: 'top',
      original_title: jargon.desc
    }
  )
end

示例:

jargon = OpenStruct.new(id: 130, desc: 'desc for jargon 1', word: 'jargon1')
puts get_node(jargon)

输出:

<a class="jargon-tip" data-toggle="tooltip" data-placement="top" data-original-title="desc for jargon 1" rel="help" href="#jargon-130">jargon1</a>