我正在尝试对Rails测试进行断言,该测试测试方法重定向到某个URL,但是对于我的断言,URL只是部分完成,因为我不完全确定完整路径是什么。因此,我试图为部分路径写一个断言。这就是我所拥有的,但我对正则表达式并不是很好。
assert_match /[#{PAYPAL_CONFIG["url"]}]./, @response.redirect_url
我希望它与paypal路径相匹配,然后在此之后发生任何事情,但我不确定如何做到这一点。当我使用这个正则表达式来匹配时我在我的测试empty range in char class: /[https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?]./
中得到一个错误我知道我的正则表达式是错误的,我试图在paypal网址后匹配任何东西。有人可以帮帮我吗?
我可以看到[]括号充当或我想要的是指定的路径以及之后的任何内容。
我已将我的断言改为:
/#{PAYPAL_CONFIG["url"]}.*/
我的测试通过,但我收到此警告:WARNING: MiniTest::MINI_DIR was removed. Don't violate other's internals.
我的正则表达式是否正常?感谢
答案 0 :(得分:2)
你应该在将它放入正则表达式之前将其转义。
像
这样的东西/#{Regexp.escape(PAYPAL_CONFIG["url"])}/
可能会更好。
WRT你的例子,问题出在cgi-bin
位。正则表达式引擎期望连字符表示一系列字符,i-b
不是合法范围,因为在i和b之上都没有字符。
没有方括号的版本工作的原因是因为正则表达式引擎只将连字符解释为括号内的一系列字符,但正则表达式本身仍然会搞砸。
>> foo = "https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?"
=> "https://www.sandbox.paypal.com/cgi-bin/webscr?"
>> /[#{foo}]/
RegexpError: empty range in char class: /[https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?]/
from (irb):2
>> /[#{Regexp.escape(foo)}]/
=> /[https:\/\/www\.sandbox\.paypal\.com\/cgi\-bin\/webscr\?]/
>> Regexp.escape(foo)
=> "https://www\\.sandbox\\.paypal\\.com/cgi\\-bin/webscr\\?"
>> foo
=> "https://www.sandbox.paypal.com/cgi-bin/webscr?"