2

次の webrat マッチャーを使用しています。

response.should contain(text)

次のハムルで:

%p
  You have
  = current_user.credits
  credits

上記の webrat マッチャーを使用するキュウリのステップ「その後、「You have 10 credits」が表示されるはずです」を作成しました。ステップは失敗します。haml が実際に生成するため、webrat は応答内のテキストを検出しません。

<p>You have
10
credits</p>

haml が生成する出力とマッチャーを一致させるにはどうすればよいですか?

注:上記は、私が扱っている状況の単純化された例です。次の haml を記述することは、受け入れられる解決策ではありません。

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

4 に答える 4

3

そうです、これは苦痛です。私は、Webrat があまりにも多くの場合、いらいらするほど敏感であることに気づきました。

2 つのアイデア:

  1. テストを修正します。この場合、改行を無視したいので、改行をすべて取り除きます。response.tr("\n","").should contain(text)
  2. Haml を修正します。 これはおそらくより良いオプションです。複数行ターミネータ|を使用して、Haml に改行を入れないように指示できます。
    %p
      | 持っています。
      = current_user.credits |
      クレジット

このようなもっとあいまいなものについては、Haml リファレンスを参照してください。(その驚くべき量は空白と関係があります。)

于 2009-10-13T19:02:41.097 に答える
2

より良い

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

だろう

%p You have #{current_user.credits} credits

Haml は自動的にテキスト ノードを補間するためです。

于 2010-10-26T16:18:32.407 に答える
1

次のようなことがわかりました:

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

私の Haml をいじる必要なく、私が望む試合をしばしば私に与えてくれます。本当に読みやすくしたいマークアップをいじくり回すか、マッチャーを正規表現に変更するかの選択を考えると、後者は、ビューのより単純なコーディングに支払う代償としては小さいように思えます。

于 2009-11-13T22:37:53.917 に答える
0

Haml には空白を操作するためのさまざまな機能がありますが、ここで行う正しいことは、空白に依存しないようにマッチャーを修正するか、インライン コンテンツを記述するためのフィルターを使用することです。例えば:

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

または、より複雑なロジックが必要な場合:

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

Haml はドキュメントの構造を効率的に表現するために設計されていますが、インライン コンテンツを表現するのはあまり得意ではありません。(ここのように) ファンシーなインライン処理を行いたい場合は、純粋に Haml を使用するのではなく、ERB/H​​TML を使用する方が理にかなっています。詳細については、このブログ投稿を参照してください。

于 2010-10-26T18:15:32.147 に答える