0

ビューとルーターの動作テストを行うために別の URL に移動する唯一の方法は、Backbone.history.loadUrl() を使用することです。Backbone.history.navigate('#something', true) と router.navigate('#something, {trigger: true, replace: true} およびそれらの組み合わせは、テスト内で機能しません。私のアプリケーションは pushstate を使用しません。

これは、単一のテストのコンテキスト内で正しく機能します。

describe('that can navigate to something as expected', function(){
  beforeEach(function() {
    this.server = sinon.fakeServer.create();
    //helper method does my responds to fetches, etc. My router in my app is what starts Backbone.history
    this.router = initializeBackboneRouter(this.server, this.fixtures, false);
  }); 
  afterEach(function(){
    this.server.restore();
    Backbone.history.stop();
    Backbone.history.loadUrl('#');
  });

  it('should create the view object', function(){
    Backbone.history.loadUrl('#something');
    expect(this.router.myView).toBeDefined();
  });
});

テスト中に、バックボーンが予想どおり URL にハッシュを追加していることがわかります: localhost:8888/#something テストによって異なります。

残念ながら、loadUrl はテストの動作に多くの矛盾をもたらしているようです。AJAX 呼び出しが完了するのを待つ必要がある非同期 JS を含む私のテストの 1 つでは、約 50% の時間でタイムアウトが発生したり、場合によっては定義されていないことが予想されたりして失敗します。私がそこにあると期待するデータを慰めれば、それはBSテストではないことを知っています.

it('should add the rendered html to the body', function(){
  runs(function(){
    Backbone.history.loadUrl('#something');
  });
  waitsFor(function(){
    var testEl = $('#title');
    if(testEl.length > 0){ return true; }
  }, 1000, 'UI to be set up');
  runs(function(){
    var testEl = $('#title');
    expect(testEl.text()).toEqual(this.router.model.get(0).title);
  });

});

ここで重要なことは、すべてのテストが実行されたときにのみ失敗するということです。単独で実行すると、100% の確率で合格します。

私の質問は次のとおりです: Backbone.history.loadUrl は、ジャスミンのバックボーン アプリの周りでプログラムによるナビゲーションを行うには悪い方法ですか? これを取得して、特定の URL にアクセスするユーザーをシミュレートするためにあらゆることを試みたように感じます。私のティアダウンは間違っていますか?Backbone.history.loadUrl('#'); なしで試してみました 異なる動作をしましたが、テストに合格しませんでした。

中心的な問題は、数回、数百回、さらには数回のジャスミン テストのコンテキストで、Backbone.history がそれ自体をクリアせず、各テストで完全に再初期化されるのではなく、それ自体の 1 つのインスタンスとして固執していることです。

4

1 に答える 1