web-dev-qa-db-ja.com

AngularJSで正規表現を使用する方法$ httpBackend ExpectGET

$ resourceGETリクエストのパラメータとしてURLを渡しています。 AngularはこのパラメーターをエンコードするURLであり、$ httpBackend.expectGETメソッドでリクエストを照合するのは厄介です。

正規表現を使用して期待されるリクエストに一致させることはできますが、機能させることはできません。リソースの場所を一致させたいのですが、任意の「uri」クエリ文字列パラメーター値と一致させます。

Ctrl

var resource = $resource('../api/lookup');
resource.get({ uri: "http://www.something.com" }, function (data) {
  // do something
});

テスト

// mock out the $httpBackend response

$httpBackend.expectGET(/\.\.\/api\/lookup\?uri=.*/)).respond(200, { Response: "a response" });

// call my test method here

// ensure the $httpBackend work is done
$rootScope.$apply();
$httpBackend.flush();

// do assertions

カルマ出力

Error: Unexpected request: GET ../api/lookup?uri=http%3A%2F%2Fwww.something.com

Expected GET /../api/lookup?uri=.*/

正規表現が一致しない理由を誰かが理解できますか?

編集

提案されたように正規表現を改善した後でも、 '$ var'インジェクション構文を使用してこれを機能させることができませんでした。テストを書き直し、inject関数を使用して依存関係を注入し、テストの配置の順序が正しいことを確認しました。今では魅力のように機能しています!

13
daddywoodland

正規表現の疑問符をエスケープする必要があります。

エスケープせずに、その前のトークンをオプションとしてマークするだけです。

> test = "../api/lookup?uri=http%3A%2F%2Fwww.something.com";

> test.match(/\.\.\/api\/lookup?uri=.*/);
null

> test.match(/\.\.\/api\/lookup\?uri=.*/);
["../api/lookup?uri=http%3A%2F%2Fwww.something.com"]
8
John Ledbetter

疑問符をダブルスラッシュでエスケープする必要があります\\?

$httpBackend.expectGET(/\.\.\/api\/lookup\\?uri=.*/)).respond(200, { Response: "a response" });

さらに、次のような正規表現を作成することもできます。

new RegExp('../api/lookup\\?uri=.*')

//エスケープされたスラッシュの後に修飾子が続く場合、構文に問題があります

6
LanderV