2012-09-07 60 views
1

任何人都可以向我解釋爲什麼會發生這種情況嗎?Rspec應匹配是錯誤的,但應該是真實的?

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 

回答

3

這似乎很可能* *預期的行爲,但我已經找到了問題。絃樂#匹配Ruby的文件說

轉換模式是正規表達式(如果它尚未之一)

但這種「轉換」似乎只是意味着改變「富」到/富/,沒有做任何轉義或任何事情。因此,例如,

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 

!!!!

1

只是一個猜測,但是匹配使用正則表達式,其中*部分是指「任何數量的空格」,而不是「空間 - 和 - *」。逃避(或其他)字符。

response.body.should eq 'User-agent: \*\nDisallow: /\n' 
相關問題