使用webrat包含haml的(文本)匹配器

时间:2009-10-08 09:09:45

标签: ruby-on-rails cucumber haml webrat

我正在使用以下网络匹配器:

response.should contain(text)

使用以下haml:

%p
  You have
  = current_user.credits
  credits

我已经写了黄瓜步'然后我应该看到“你有10个学分”',它使用上面的webrat匹配器。步骤失败,webrat在响应中找不到文本,因为haml实际产生了

<p>You have
10
credits</p>

如何让匹配器匹配haml产生的输出?

注意:以上是我正在处理的情况的简化示例。编写以下haml是不可接受的解决方案:

%p= "You have #{current_user.credits} credits"

4 个答案:

答案 0 :(得分:3)

你是对的,这是一种痛苦。我发现Webrat太多时间都很烦人。

两个想法:

  1. 修复您的测试。在这种情况下,您希望它对新行无视,因此请将其全部删除:response.tr("\n","").should contain(text)
  2. 修复你的Haml。这可能是更好的选择。您可以使用多行终结符|告诉Haml不要将换行符放在:
  3.     %p
          You have |
          = current_user.credits |
          credits
    

    有关此类更为模糊的内容,请参阅Haml reference。 (惊人的数量与空白有关。)

答案 1 :(得分:2)

优于

%p= "You have #{current_user.credits} credits"

将是

%p You have #{current_user.credits} credits

因为Haml会自动插入文本节点。

答案 2 :(得分:1)

我发现了类似的东西:

response.should contain(/You have 10 credits/m)

经常会给我一场我想要的比赛而不必和我的Haml一起玩。考虑到我的标记与我的标记之间的选择,以及将我的匹配器更改为正则表达式之间的选择,后者对于视图的更直接编码似乎是一个很小的代价。

答案 3 :(得分:0)

Haml中有各种用于操作空格的工具,但正确的做法是将匹配器修改为与空白无关或使用过滤器来编写内联内容。例如:

%p
  :plain
    You have #{current_user.credits} credits

或者如果您需要更复杂的逻辑:

%p
  :erb
    You have <%= current_user.credits %> credits

Haml旨在有效地表达文档的结构,但它并不擅长表达内联内容。当你想做一些花哨的内联东西(就像这里)时,有必要放入ERB / HTML而不是纯粹的Haml。有关详细信息,请参阅this blog post