Ember观察者失效问题:如何重置deferred属性以修复测试用例失败?
解决Ember测试中deferred属性未重置导致观察者失效的问题
问题根源
你的测试1存在资源泄漏:调用beginPropertyChanges后未对应执行endPropertyChanges,导致内部deferred变量停留在1。后续测试2运行时,beginPropertyChanges将deferred增至2,而endPropertyChanges仅能将其减至1,始终无法触发flushSyncObservers和resumeObserverDeactivation,最终造成观察者失效。
解决方案
1. 修复测试1的根本问题(推荐)
确保无论测试逻辑是否出错,beginPropertyChanges后都能执行endPropertyChanges。用try/finally块包裹相关代码,保证资源被正确释放:
test('acceptance 1', function() { beginPropertyChanges(); try { // 原测试逻辑代码 } finally { endPropertyChanges(); } });
这种方法从根源上解决资源泄漏问题,无需依赖Ember内部不稳定的API实现。
2. 测试间强制重置deferred(应急方案)
如果暂时无法修复测试1的bug,可在测试模块的afterEach钩子中强制将deferred重置为0,同时触发必要的观察者刷新逻辑。注意:这属于依赖Ember内部API的临时hack,可能随版本更新失效:
module('Your Test Module', function(hooks) { hooks.afterEach(function() { // 引入Ember内部的property_events模块 const propertyEvents = Ember.__loader.require('ember-metal/lib/property_events'); // 循环调用endPropertyChanges直到deferred回到0 while (propertyEvents.deferred > 0) { propertyEvents.endPropertyChanges(); } }); test('acceptance 1', function() { // ...原测试逻辑 }); test('acceptance 2', function() { // ...原测试逻辑 }); });
这段代码会在每个测试结束后检查deferred值,若大于0则重复调用endPropertyChanges,直到其回到0,确保后续测试的观察者状态正常。
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

