web-dev-qa-db-fra.com

Erreur non capturée: Échec de l'assertion: appelant défini sur un objet détruit

travaillant dans les tests ember-cli. Une fois tous les tests réussis, deux tests supplémentaires sont renvoyés avec des erreurs.

Erreur non capturée: Échec de l'assertion: ensemble d'appel sur un objet détruit Source: '../dist/assets/vendor.js:13269'

ceci est une configuration de test unitaire

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

Cela est dû soit au fait que, suite à une promesse ou à un autre code différé, vous ne vérifiez pas le statut de destruction d'un objet, soit parce que vous n'avez pas supprimé quelque chose qui a été configuré et qui interagit avec des événements DOM ou quoi que ce soit d'autre que le cœur de l'objet. Ember.

J'avais l'habitude de le faire, en particulier sur certains plugins jQuery que je mappais sur Ember, et pendant les tests, les plugins se détruisaient trop lentement et j'utilisais alors soit pas de boucle d'exécution, soit je ne vérifiais pas le statut détruit de l'objet Ember que je manipulais. .

Vous pouvez le faire avec:

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

Pensez également à détruire tous les plug-ins jQuery qui auraient pu être initialisés dans le code de vos vues (toute configuration dans didInsertElement devrait être démontée dans willDestroyElement par exemple).

44
Huafu

Ok je me suis battu avec la même chose. Donc, fondamentalement, lorsque vous avez "this.set ()" dans une promesse, il peut arriver que la promesse prenne trop de temps à se résoudre et que l'utilisateur ait déjà cliqué en dehors de cette page, déjà détruit. J'ai trouvé que la solution la plus simple n'était qu'un simple chèque au début de la promesse.

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

Edit: vous pouvez aussi utiliser Ember.trySet .

11
Arntor

J'ai eu un problème similaire dans un test d'intégration. Pour résoudre le problème, dans le test d'intégration, j'ai attendu avant d'effectuer l'action suivante.

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

Le problème est lié à une promesse non complètement résolue et à un autre test exécuté immédiatement après.

Vous devriez donner Ember Concurrency a essayer.

importer {tâche, délai d'expiration} de 'ember-concurrency';

myFunction: task(function * () {

  // do somethinng

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

  // do something else

}).drop(),
0
lookininward