1

なぜこれが起こっているのか誰かが私に説明できますか?

get :robots
response.should render_template("no_index")
response.body.should match "User-agent: *\nDisallow: /\n"

Failure/Error: response.body.should match "User-agent: *\nDisallow: /\n"
  expected "User-agent: *\nDisallow: /\n" to match "User-agent: *\nDisallow: /\n"
# ./spec/controllers/robots_controller_spec.rb:12:in `block (3 levels) in <top (required)>'

だが

get :robots
response.should render_template("no_index")
response.body.should eq "User-agent: *\nDisallow: /\n"

パス?

これは関連しているようです(irb):

1.9.2p318 :001 > "User-agent: *\nDisallow: /\n".match "User-agent: *\nDisallow: /\n"
=> nil 
4

3 に答える 3

3

これは私には非常に*予期しない*動作のように思われますが、私は問題を理解しました。String#matchのRubyドキュメントには

パターンを正規表現に変換します(まだ正規表現でない場合)

しかし、この「変換」は、エスケープなどを行わずに、「foo」を/foo/に変更することを意味しているようです。だから、例えば、

1.9.2p318 :014 > "User-agent: *\nDisallow: /\n".match /User-agent: \*\nDisallow: \/\n/
=> #<MatchData "User-agent: *\nDisallow: /\n"> 

一重引用符を使用するが、特殊な正規表現文字のエスケープを追加する場合、文字列照合も機能します。

1.9.2p318 :015 > "User-agent: *\nDisallow: /\n".match 'User-agent: \*\nDisallow: \/\n'
 => #<MatchData "User-agent: *\nDisallow: /\n">

ただし、二重引用符を使用する場合は、改行が原因で機能しません。

1.9.2p318 :013 > "User-agent: *\nDisallow: /\n".match "User-agent: \*\nDisallow: \/\n"
=> nil 

!!!!

于 2012-09-07T14:22:07.167 に答える
1

文字列は(正規表現として)それ自体と照合されていますが、スラッシュやアステリックスなどの特殊文字が原因で失敗する可能性が高くなります。

eqは確かにあなたのケースで使用する正しいマッチャーです。

http://rspec.rubyforge.org/rspec/1.1.9/classes/Spec/Matchers.html#M000437

于 2012-09-07T14:13:53.513 に答える
1

推測ですが、一致には正規表現が使用されます。この*部分は、「スペースと*」ではなく「任意の数のスペース」を意味します。その(または他の)文字をエスケープします。

response.body.should eq 'User-agent: \*\nDisallow: /\n'
于 2012-09-07T14:16:49.890 に答える