未捕获错误:断言失败:在被破坏的对象上调用set

Nin*_*nea 37 qunit ember.js ember-cli

在ember-cli测试中工作.在所有测试通过后,它返回额外的两个错误测试.

未捕获的错误:断言失败:在被破坏的对象上调用set源:'../dist/assets/vendor.js:13269'

这是一个单元测试配置

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');
    }
});
Run Code Online (Sandbox Code Playgroud)

Hua*_*afu 47

这可能是因为在promise或任何其他延迟代码的结果中,您没有检查对象的销毁状态,或者因为您没有拆除已经设置并与DOM事件或外部核心任何内容交互的内容烬.

我曾经特别在我映射到Ember的一些jQuery插件上有这个,并且在测试期间插件破坏得太慢,然后我要么不使用运行循环,要么不检查我正在操作的Ember对象的销毁状态.

您可以这样做:

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

还要考虑销毁任何可能已在视图代码中初始化的jQuery插件(例如,任何设置didInsertElement应该被拆除willDestroyElement).

  • @Nagarjun我会将链接的答案添加为此问题的另一个答案. (2认同)
  • 未来的旅行者:以一种可靠的方式来避免整个Ember应用程序出现此问题,请访问http://ember-concurrency.com/ (2认同)

Arn*_*tor 11

好吧,我在类似的事情上挣扎.所以基本上当你在promise中有"this.set()"时,可能会发生promise需要很长时间才能解决,并且用户已经点击了该页面,在这种情况下你试图设置一些东西,那就是已经被毁了.我发现最简单的解决方案只是在承诺的开头进行简单的检查.

if (this.isDestroyed) {
    return;
}
this.set('...');
...
Run Code Online (Sandbox Code Playgroud)

编辑:或者您可以使用Ember.trySet.