Rspec控制器测试失败了撇号字符?

msm*_*114 8 factory rspec ruby-on-rails faker

现在我使用"Faker"公司名称进行单元测试失败.

看起来好像expect(response.body).to match(@thing.name)搞砸了.

在查看错误时,Faker公司的名称有时会包含"O'Brian Company"或"O'Hare Company"或类似名称.

faker是编码字符串吗?因为我知道匹配编码的字符串不是一个好主意,我真的不想只在Factory im中指定一个特定的公司名称.

谢谢

Pau*_*rth 7

Faker不会为您做任何编码.它只会给你一个字符串O'Malley.但响应应该有HTML转义(或其他类型,取决于格式),如O'Malley.你总是puts response.body可以肯定地看到.

RSpec的matches匹配确实是设计为两种expectedactual成为一个正则表达式,但在你的情况下,两个都是字符串.因为代码有一个优化调用values_match?,它做了一个简单的比较,你实际上是在说expect(response.body).to eq(@thing.name).

如果你想要一个正则表达式,你应该小心使用不受控制的值来创建它.幸运的是Ruby就是Regexp.escape这样,所以你可以说Regexp.new("foo" + Regexp.escape(@thing.name) + "bar").但是从您的反对意见include来看,听起来您实际上希望响应只包含名称,对吗?在这种情况下,您根本不需要正则表达式.

在任何情况下,问题不在于名称周围的内容,而是名称如何转义.因此,在比较之前,您应该(1)解码响应或(2)编码faker字符串.哪个并不重要.两者都很简单:

expect(CGI.unescapeHTML(response.body)).to eq @thing.name
Run Code Online (Sandbox Code Playgroud)

要么

expect(response.body).to eq CGI.escapeHTML(@thing.name)
Run Code Online (Sandbox Code Playgroud)

当然,如果你的响应是JSON,你应该用JSON等替换所有这些HTML转义的东西.