1

ember の統合テスト パッケージ ( http://emberjs.com/guides/testing/integration/ ) を試していますが、このエラーが発生しています

Assertion Failed: You have turned on testing mode, which disabled the run-loop's autorun.    
You will need to wrap any code with asynchronous side-effects in an Ember.run

このエラーを再現するために JSBin を作成しました: http://jsbin.com/InONiLe/9。ブラウザのコンソールを開くと確認できます。

このエラーの原因は、 のメソッド内の行data.set('isLoaded', true);にあると思います。(コードへのリンク: http://jsbin.com/InONiLe/9/edit )load()App.Posts

ここで、data.set('isLoaded', true);行を で囲むEmber.run()と、期待どおりに機能し、テストに合格します。

ただし、私は多くのモデルにこのパターンを使用しており、すべて.set()を でラップしたくありませんEmber.run()(トランジションでも同じエラーが発生します)。また、テストを機能させるためにアプリケーション コードを変更したくありません。

エラーを修正するために他にできることはありますか?

注: 意図的にモデル フックで promise を返さないようにしています。そうしないと、promise が解決されるまで UI がブロックされるためです。ローディング スピナーを表示できるように、ルートへの遷移をすぐに実行したいと考えています。

4

1 に答える 1

3

ajax、setInterval、indexeddb api などの非同期コードをトリガーするいくつかのメソッドを使用する場合、これらのメソッドの解決されたコールバックを にデリゲートする必要があるEmber.runため、ember はこれらの操作を実行ループでキューに入れ、アプリケーションが確実に実行されるようにします。同期します。したがって、これを処理する正しい方法は、コードを変更することです。

App.Posts = Ember.Object.create({
  load: function() {
    return new Ember.RSVP.Promise(function(resolve, reject) {      
      var data = Ember.Object.create();
      $.ajax({
        url: 'https://api.github.com/users/octocat/orgs'
      }).then(function() {
        data.set('isLoaded', true);
        Ember.run(null, resolve, data);        
      }, reject);      
    });    
  }
});

Ember.RSVP.Promiseその他のアドバイスは、 よりも Ember との互換性が高いため、常に を使用することです$.Defered。$.Deferred は によって返され$.ajaxます。

ここに更新されたjsbinがありますhttp://jsbin.com/InONiLe/10/edit

アップデート

あなたの場合、約束を返したくないので、それをドロップして、データ自体を返すだけです。

App.Posts = Ember.Object.create({
  load: function() {    
    var data = Ember.Object.create();    
    $.ajax({
      url: 'https://api.github.com/users/octocat/orgs'
    }).then(function() {        
      Ember.run(function() {
        data.set('isLoaded', true);
      });                
    }, function(xhr) {        
      Ember.run(function() {
        // if using some ember stuff put here
      });
    });
    return data;
  }
});

これは、この作業を示す jsbin ですhttp://jsbin.com/InONiLe/17/edit

役立つことを願っています

于 2013-09-06T19:14:27.327 に答える