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

时间:2014-08-05 14:49:14

标签: ember.js qunit 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');
    }
});

4 个答案:

答案 0 :(得分:44)

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

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

你可以这样做:

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

另外请考虑销毁可能已在视图代码中初始化的任何jQuery插件(didInsertElement中的任何设置都应该在willDestroyElement中进行拆分。)

答案 1 :(得分:11)

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

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

修改:您也可以使用Ember.trySet

答案 2 :(得分:0)

我在集成测试中遇到了类似的问题。要解决,在集成测试中,我等待执行下一个操作。

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

答案 3 :(得分:0)

该问题与承诺未完全解决以及另一个测试在紧随其后开始运行有关。

您应该尝试Ember Concurrency

从'ember-concurrency'导入{任务,超时};

myFunction: task(function * () {

  // do somethinng

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

  // do something else

}).drop(),