Подтвердить что ты не робот

Ошибка при сбое: ошибка подтверждения: вызов набора на уничтоженном объекте

работающий в тесте 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');
    }
});
4b9b3361

Ответ 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.