web-dev-qa-db-ja.com

不明なエラー:アサーションに失敗しました:破棄されたオブジェクトのセットを呼び出しています

ember-cliテストでの作業。すべてのテストに合格すると、余分な2つのテストとエラーが返されます。

キャッチされていないエラー:アサーションに失敗しました:破棄されたオブジェクトのセットを呼び出しますソース: '../dist/assets/vendor.js:13269'

これは1つの単体テスト構成です

import Ember from "ember";
import { test,moduleFor } from 'ember-qunit';
import startApp from '../helpers/start-app';

var App;

module('An Integration test',{
    setup:function(){
        App=startApp();
    },
    teardown: function() {
        Ember.run(App, 'destroy');
    }
});
37
Nininea

これは、promiseまたは他の遅延コードの結果として、オブジェクトの破棄ステータスをチェックしないため、またはセットアップされてDOMイベントまたはコアの外部にあるものと相互作用するものを分解しなかったためです。エンバー。

EmberにマップしたjQueryプラグインで特にこれを使用していましたが、テスト中にプラグインの破棄が遅すぎたため、実行ループを使用していないか、Ember私が操作していたオブジェクト。

あなたはそうすることができます:

if ( !(obj.get('isDestroyed') || obj.get('isDestroying')) ) {
  // do your destroying code setting stuff
}

また、ビューのコードで初期化されている可能性のあるjQueryプラグインを破棄することも検討してください(didInsertElementのセットアップはすべてwillDestroyElementで分解する必要があります)。

47
Huafu

わかりました、私は同様のことに苦労しました。つまり、基本的にプロミス内に「this.set()」がある場合、プロミスの解決に時間がかかりすぎて、ユーザーがそのページから既にクリックしたことがあります。この場合、何かを設定しようとしています。すでに破壊されました。私は、最も簡単な解決策は、約束の最初の単純なチェックであることがわかりました。

if (this.isDestroyed) {
    return;
}
this.set('...');
...

編集:または、 Ember.trySet を使用できます。

11
Arntor

統合テストでも同様の問題がありました。解決するために、統合テストでは、次のアクションを実行する前に待機しました。

import wait from 'ember-test-helpers/wait';
wait().then(() => {
// perform action (which previously used to cause an exception)
});
0
Naveen N

この問題は、約束が完全には解決されず、別のテストがすぐに実行されることに関連しています。

Ember Concurrency を試してください。

import {task、timeout} from 'ember-concurrency';

myFunction: task(function * () {

  // do somethinng

  yield timeout(1000); // wait for x milliseconds

  // do something else

}).drop(),
0
lookininward