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 回答