Ошибка при сбое: ошибка подтверждения: вызов набора на уничтоженном объекте
работающий в тесте ember-cli. После прохождения всех тестов возвращается еще два теста с ошибками.
Неиспользуемая ошибка: утверждение не выполнено: вызов набора на уничтоженном объекте Источник: '../dist/assets/vendor.js: 13269'
это одна конфигурация unit test
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');
}
});
Ответы
Ответ 1
Это происходит потому, что в результате обещания или любого другого отложенного кода вы не проверяете статус уничтожения объекта или потому, что вы не срывали то, что было настроено, и взаимодействовать с событиями DOM или чем-либо внешним ядро Эмбера.
Я использовал это особенно для некоторых плагинов jQuery, которые я сопоставил с Ember, и во время тестов плагины слишком медленно разрушались, и тогда я либо не использовал цикл запуска, либо не проверял разрушенное состояние объекта Ember Я манипулировал.
Вы можете сделать это с помощью
if ( !(obj.get('isDestroyed') || obj.get('isDestroying')) ) {
// do your destroying code setting stuff
}
Также подумайте об уничтожении любых плагинов jQuery, которые могли быть инициализированы в коде ваших представлений (например, любая настройка в didInsertElement
должна быть отключена в willDestroyElement
).
Ответ 2
Хорошо, я боролся с подобной вещью. Таким образом, в основном, когда у вас есть "this.set()" внутри обещания, может случиться так, что обещание слишком долго для решения, и пользователь уже нажал на эту страницу, в этом случае вы пытаетесь установить что-то, уже уничтожен. Я нашел простейшее решение просто простой проверкой в начале обещания.
if (this.isDestroyed) {
return;
}
this.set('...');
...
Изменить: альтернативно вы можете использовать Ember.trySet.