ruby-on-rails – Rspec控制器测试失败了撇号字符?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rspec控制器测试失败了撇号字符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
现在我使用“Faker”公司名称进行单元测试失败.

似乎期望(response.body).匹配(@ thing.name)是什么搞砸了.

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

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

谢谢

解决方法

Faker不会为你做任何编码.它会给你一个像奥马利这样的字符串.但响应应该有 HTML转义(或其他类型,取决于格式),如O' Malley.您总是可以放置response.body来查看.

RSpec匹配匹配器真的设计为for either expected or actual to be a regular expression,但在你的情况下两者都是字符串.因为代码has an optimization calling values_match?does a simple comparison,你实际上是在说expect(response.body).to eq(@ thing.name).

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

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

expect(CGI.unescapeHTML(response.body)).to eq @thing.name

要么

expect(response.body).to eq CGI.escapeHTML(@thing.name)

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

猜你在找的Ruby相关文章