14

私はいくつかのテストにJasmineを使用していますが、これは一般的にブラウザーベースのjavascript単体テストに適用できます。

特定の条件で、を使用してユーザーを別のページにリダイレクトする関数がありますwindow.location.assign。問題は、この行に到達すると、ページがリダイレクトされることです。この場合、にリダイレクトされるため'/'、ページがリロードされ、すべてのテストが再度実行されます。関数がリダイレクトせずにリダイレクトする行に到達することをテストするにはどうすればよいですか?

4

4 に答える 4

19

私はこれと同じ問題に直面しました。私の解決策は、実際のリダイレクトを単一の目的の関数に分割することでした。つまり、条件チェックやその他のロジックを実行せず、リダイレクトするだけです。これが古いコードだと言ってください...

function redirect() {
 if(something) {
  window.location = "/";
 else if(somethingElse)
  window.location = "/?a=42";
 else
  window.location = "/derp";
}

私はそれをに変更します。

function redirect() {
 if(something) {
  doRedirect("/");
 else if(somethingElse)
  doRedirect("/?a=42");
 else
  doRedirect("/derp");
}

function doRedirect(href) {
 window.location = href;
}

次に、リダイレクト関数が条件に対して正しいURIを渡していることを確認する関数をspyOn実行できます。doRedirect

于 2011-05-27T15:21:22.247 に答える
1

これは、購入ボタンをクリックすると、前述の@Morganの方法を使用してユーザーを外部URLにリダイレクトすることをテストするための完全な例です。

# navigation.coffee
exports.goToExternalUrl = (url) ->
    window.location = url


# myView.coffee
Navigation = require("lib/navigation")

exports.MyView = Backbone.View.extend
  events:
    "click .purchase":"purchase"

  purchase: ->
    Navigation.goToExternalUrl("http://amazon.com/someproduct")


# my_view_spec.coffee
Navigation = require("lib/navigation")
MyView = require("myView").MyView

describe("MyView"), ->
  it "can be purchased", ->
    # this line prevents the location.href from actually being set
    spyOn(Navigation,'goToExternalUrl').andCallFake (->)

    $el.find('.purchase').trigger('click')
    expect(Navigation.goToExternalUrl).toHaveBeenCalled()
于 2012-03-23T18:30:25.777 に答える
1

ここでの難しさは、コードがグローバル変数にwindow依存しているため、テストでその依存関係を簡単に置き換えることができないことです。これが私が同じような状況でしたことの基本的な考え方です。windowローカル/インスタンス変数に保存される初期化中を除いて、間接的にのみアクセスされるようにコードを記述します。

var unit = {
  initialize: function () {
    this.window = window;
  },
  codeThatRedirects: function (newUrl) {
    this.window.location.href = newUrl;
  }
};

unit.windowこれで、次のように、他のものに置き換えることができます。

unit.initialize();
unit.window = {
  location: {
    href: "dummy"
  }
};

unit.codeThatRedirects('http://new.url.com');

assert(unit.window.location.href === "http://new.url.com");
于 2012-11-09T00:41:45.000 に答える
-1

あなたはGreaseMonkeyを使ってjavascriptを更新することを検討するかもしれませんが、これはやや煩わしいままです...

于 2011-05-27T17:27:52.760 に答える