4

Backbone.history.startを呼び出すBackbone.Routerインスタンスを作成し、そのすべてのトレースを破棄して、再度作成できるようにしたいとします。

ユニットテストのためにこれを行う必要があります。

問題は、バックボーンルーターの作成がグローバルな影響を与えることです。Backbone.historyのように、作成するまで定義されていません。

var ReversibleRouter = Backbone.Router.extend({
  initialize: function(){
    _buildAppPaths(this.options) // Implementation not shown. Builds the application paths
    Backbone.history.start()
  },
  destroy: function(){
    // TODO: Implement this
  }
})

アプリケーションのルーターの実装で単体テストを実行できるように、作成して完全に破棄できるようにしたいと思います。

呼び出しBackbone.history.stop()て設定するだけで十分Backbone.history = undefinedですか?

4

2 に答える 2

1

より完全なスタック統合タイプのテストを実行する場合は、次を使用してアプリケーションのルーターをリセットできます。

Backbone.history.stop()
Backbone.history = undefined // Could also probably use delete here :)

これはこれまでのところ成功しています。私たちのテストでは、qunitテスト中にルーターを5回インスタンス化して強制終了します。よく働く。

@AdamTerlsonのように嘲笑するのが長期的にはより良い方法だと言っているかもしれませんが、私はまだユニットと統合テストの哲学を学んでいます。ただし、フルスタックテストを1つか2つ行ってもかまいません。

于 2013-02-24T17:12:59.173 に答える
0

これは不正行為かもしれませんが、テストする機能のユニット外の機能をモックする必要があり、特にユニットテストがライブDOM、サーバー、またはブラウザーにヒットしないようにする必要があると思います。

SinonJSを調べてください。これは素晴らしいことです。

これは、ブラウザの履歴状態に影響を与えることなく、ルーターの初期化メソッドをテストする例です。

test('...', function () {
    // Arrange
    var buildAppPaths = sinon.stub(ReversibleRouter.prototype, '_buildAppPaths');
    var startHistory = sinon.stub(Backbone.history, 'start');
    var options = {};

    // Act
    new ReversibleRouter(options);

    // Assert
    ok(buildAppPaths.calledWith(options));
    ok(startHistory.calledOnce); // or ok(Backbone.history.start.calledOnce);
});

このアプローチでは、パラメータを含むすべての機能の外部ユニットに対してすべての呼び出しが行われたことを正常に表明しました。その時点で、外部呼び出しがその仕事をすることを信頼できます(追加の単体テストによって証明されます)。

この1つのユニットの外部で呼び出しを行うには、単体テストではなく統合テストを実行します。

于 2013-02-09T03:10:56.937 に答える