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');
}
});
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).
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.
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)
});
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(),