unit-testing - 有人知道如何“完全”销毁 UI5 实例吗?

标签 unit-testing sapui5

尝试测试我的基于 UI5 的应用程序。我不喜欢 OPA 的东西,所以我一直在使用 QUnit。这很好——可以正常工作。我想从头开始每个模块,这样测试就不会互相污染,并且我可以从干净的状态开始。但是,每次我创建应用程序的新实例时,都是重复 ID 错误(显然......)。 Destroy() 会删除与应用程序相关的所有 DOM 元素,但事件的 core 仍然存在,这似乎会记住以前创建的元素,因此这无法解决任何问题。

如何重新启动 UI5?我唯一的选择是将每个模块粘贴在它们自己的 HTML 页面中,这并不好。

最佳答案

当我读到你的帖子时,我想:哇,如果他是对的,我们就面临着严重的内存泄漏问题。

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

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

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

然后我运行分析器并观察内存。它首先增长到某个点,然后再次定期释放:

Chrome memeory profile

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

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

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

更新:

如果您有一个应用程序,并且所有控件都位于应用程序控件树下的某个位置(意味着:所有控件都添加到父控件的聚合中),则只需销毁该应用程序也会销毁所有子控件(及其子控件)。

关于unit-testing - 有人知道如何“完全”销毁 UI5 实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31475880/

相关文章:

java - 无法使用 PowerMockito 模拟系统类静态方法

c# - 如何在没有 ControllerContext 的情况下从 IIdentity 模拟 GetUserId 和 IsAuthenticated

java - 如何验证构造函数中的方法调用?

javascript - 来自 fiori 应用程序模板时将 ui5 应用程序部署到启动板

javascript - 为 sap.m.DatePicker 设置约束

sapui5 - 绑定(bind)完成后执行 Action

unit-testing - 如何在不使用任何数据库的情况下测试 Hibernate 条件查询?

.net - 以多线程方式运行 nUnit 测试

javascript - 在 Controller 中创建 StandardListItem 并在项目上按下事件不会触发

javascript - 如何测试模型中依赖于 Controller 的函数