我有一个非常基本的Ember-CLI应用程序,运行大约75个左右的QUnit断言全部通过。当我生成验收测试时:
ember generate acceptance-test games
产生:
import Ember from 'ember';
import { module, test } from 'qunit';
import startApp from '../helpers/start-app';
var application;
module('Acceptance: Games', {
beforeEach: function() {
application = startApp();
},
afterEach: function() {
Ember.run(application, 'destroy');
}
});
test('visiting /games', function(assert) {
visit('/games');
andThen(function() {
assert.equal(currentPath(), 'games');
});
});
然后我的测试开始在路径的JSHint单元测试中中断:
52. JSHint - unit/routes/games: global failure (1, 0, 1)
1. Uncaught Error: Assertion Failed: calling set on destroyed object
Source: http://localhost:4200/assets/vendor.js:14407
我刚刚开始进行这些Ember-CLI集成测试,所以也许还有我缺少的东西?这个错误似乎可能是我设置了一些东西而不是在其他地方正确地拆除它?即使情况如此,我也不确定为什么在没有测试通过的情况下添加一个验收测试会产生这种情况。
控制台还显示:
WARNING: Library "App" is already registered with Ember.
ember.debug.js:3940 Uncaught Error: Assertion Failed: calling set on destroyed object
供参考,我在:
DEBUG: Ember : 1.10.0
DEBUG: Ember Data : 1.0.0-beta.15
DEBUG: jQuery : 1.11.2
提前致谢,
更新
从验收测试中删除生成的代码并替换为:
assert.ok(true);
所有测试都通过。一旦我添加了类似的东西:
visit('/games');
然后我开始在被破坏的对象上看到"调用集"在各种单元测试中看似随机的错误。
答案 0 :(得分:1)
我终于找到了这个。问题在于初始化器本质上创建了一个运行时钟(类似this),我用它来重新绘制视图。
我的初始化程序使用setTimeout
更新初始化程序的属性。鉴于错误消息,我假设初始化程序的生存时间长于给定的测试,并在被销毁后调用setProperties
。
目前,我把计时器包裹起来:
if (!this.get('isDestroyed') && !this.get('isDestroying')) {
...
}
只是为了让测试通过,但似乎我应该一起摆脱setTimeout
,而不是Ember.run.later
?