web-dev-qa-db-de.com

Nicht abgerufener Fehler: Assertion fehlgeschlagen: Aufruf des gesetzten Objekts für ein zerstörtes Objekt

arbeiten in Glut-Cli-Tests. Nachdem alle Tests bestanden wurden, werden zwei zusätzliche Tests mit Fehlern ausgegeben.

Nicht abgerufener Fehler: Assertion fehlgeschlagen: Aufruf des Satzes für das zerstörte Objekt Quelle: '../dist/assets/vendor.js:13269'

dies ist eine Gerätetestkonfiguration

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

Das liegt entweder daran, dass Sie im Ergebnis eines Versprechens oder eines anderen verzögerten Codes den Zerstörungsstatus eines Objekts nicht überprüfen, oder weil Sie etwas, das eingerichtet wurde und nicht mit DOM-Ereignissen oder anderen Objekten außerhalb des Kerns von DOM interagiert, nicht abgerissen haben Glut.

Ich hatte dies vor allem bei einigen jQuery-Plugins, die ich Ember zugeordnet hatte, und während der Tests zerstörten die Plugins zu langsam, und ich verwendete entweder keine Laufschleife oder überprüfte nicht den zerstörten Status des von mir manipulierten Ember-Objekts .

Sie können dies mit:

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

Denken Sie auch daran, alle jQuery-Plugins zu zerstören, die möglicherweise im Code Ihrer Ansichten initialisiert wurden (alle Einstellungen in didInsertElement sollten beispielsweise in willDestroyElement abreißen).

44
Huafu

Ok, ich habe mit ähnlichen Dingen zu kämpfen. Wenn Sie also "this.set ()" in einem Versprechen haben, kann es vorkommen, dass das Versprechen zu lange dauert, und der Benutzer hat bereits von dieser Seite geklickt bereits zerstört Die einfachste Lösung fand ich zu Beginn des Versprechens nur als einfache Prüfung.

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

Bearbeiten: Alternativ können Sie Ember.trySet verwenden.

11
Arntor

Ich hatte ein ähnliches Problem in einem Integrationstest. Um das Problem zu lösen, habe ich im Integrationstest gewartet, bevor ich die nächste Aktion ausführte.

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

Das Problem bezieht sich auf ein Versprechen, das nicht vollständig gelöst werden kann, und ein weiterer Test wird sofort ausgeführt.

Sie sollten Ember Concurrency versuchen.

import {task, timeout} von 'ember-concurrency';

myFunction: task(function * () {

  // do somethinng

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

  // do something else

}).drop(),
0
lookininward