2009-10-08 45 views
2

我使用以下webrat匹配:使用webrat的包含(文本)匹配與HAML

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" 

回答

3

你說得對,這是一種痛苦。我發現Webrat在很多時候都很惱人。

兩個想法:

  1. 解決您的測試。在這種情況下,你希望它對換行失明,所以擺脫它們全部:response.tr("\n","").should contain(text)
  2. 修復你的Haml。這可能是更好的選擇。您可以使用多終止|告訴Haml的,不要把換行符:
 
    %p 
     You have | 
     = current_user.credits | 
     credits 

像這種比較模糊的東西見Haml reference。 (這數量驚人的有空白做)

+1

你的多行Haml不起作用。多行運算符與將所有內容放在同一行上相同,因此您的示例等同於'You have = current_user.credits'。 '='只是成爲文本的一部分。 – 2010-10-26 18:12:00

1

我發現,這樣的:

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

會經常給我我想要無我有我的Haml的偷懶了比賽。考慮到在我的標記之間進行選擇,我真的想要讀取標記,並將匹配器更改爲正則表達式,後者對於更直接的視圖編碼來說似乎付出了很小的代價。

2

優於

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

%p You have #{current_user.credits} credits 

因爲Haml的自動插補文本節點。

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