任何人都知道如何*完全*破坏UI5实例?

时间:2015-07-17 12:29:01

标签: unit-testing sapui5

尝试测试基于UI5的应用。我不喜欢OPA的东西,所以我一直在使用QUnit。这很好 - 按照它应该的方式工作。我想从头开始使用每个模块,以便测试不会相互污染,我可以从一个干净的状态开始。但是,每次我创建应用程序的新实例时,都会出现duplicate ID个错误(显然......)。 destroy()删除了与应用程序相关的所有DOM元素,但是活动的core仍处于活动状态,而这似乎记住了之前创建的元素,因此不会解决任何问题。

如何重启UI5?我唯一的选择是将每个模块都粘贴在自己的HTML页面中,这不是很棒。

1 个答案:

答案 0 :(得分:3)

当我读到你的帖子时,我想:哇,如果他是对的,我们手上就会出现严重的内存泄漏问题。

但后来我写了一个测试...; - )

http://jsbin.com/pocayekalu/5/edit?js,output

上面的测试只是用随机数组创建垃圾控件,只是污染内存。五秒钟后,它们全部被销毁并创建新的 - 最后一个计数器被渲染到DOM。

然后我跑了探查器并观察了记忆。它首先成长到某一点,然后再次定期释放:

Chrome memeory profile

发生的事情是,一旦你销毁一个控件,就会从核心中的地图中删除它,它会按ID存储对所有控件的引用。 这并不意味着Javascript对象被销毁 - 您仍然可以保留对实际对象的引用。

一旦删除代码中对控制对象的所有引用,它仍然不意味着浏览器将它们从内存中删除,这是在下一次垃圾收集器运行期间完成的,可能会立即启动甚至从不启动 - 取决于您的应用程序使用多少内存以及浏览器引擎认为足够。

当浏览器引擎完全决定清理时,它基本上无法控制。在上面的测试中,浏览器被强制运行垃圾收集,因为我们强制它耗尽内存。

更新

如果你有一个应用程序并且所有控件都位于App的控制树下(意思是:所有控件都添加到父级的聚合中),简单地销毁应用程序也会销毁所有子控件(及其子控件)。