现在我使用“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转义的东西.