3

メソッドが特定の URL にリダイレクトされることをテストする Rails テストのアサーションを実行しようとしていますが、完全なパスがどうなるか完全にはわからないため、URL はアサーションに対して部分的にしか完成していません。したがって、部分パスのアサーションを記述しようとしています。これは私が持っているものですが、正規表現があまり得意ではありません。

assert_match /[#{PAYPAL_CONFIG["url"]}]./, @response.redirect_url

ペイパルのパスと一致させたいのですが、その後に続くものはすべて一致させたいのですが、これを正しく行う方法がわかりません。この正規表現を使用して一致させると、テストでエラーが発生しますempty range in char class: /[https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr?]./。ペイパル URL の後に何かを一致させようとしているところで、正規表現が間違っていることがわかります。誰か助けてくれませんか?

[] 角かっこがまたは指定されたパスとその後の何かとして機能することがわかります。

私は自分の主張を次のように変更しました。

/#{PAYPAL_CONFIG["url"]}.*/

私のテストはパスしますが、次の警告が表示されます: WARNING: MiniTest::MINI_DIR was removed. Don't violate other's internals.Is my regex ok or not? ありがとう

4

1 に答える 1

2

正規表現にドロップする前に、URL をエスケープする必要があります。

何かのようなもの

/#{Regexp.escape(PAYPAL_CONFIG["url"])}/ 

おそらくより良いでしょう。

あなたの例をWRTしてください。問題はcgi-binビットにあります。正規表現エンジンは、ハイフンが文字の範囲を表すことを想定していますが、i-bi の上と 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?"
于 2012-11-23T18:31:33.167 に答える