运行整套测试时出现以下错误:
timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
经过调查,我发现是内存泄漏问题。查看一些堆概要分析快照,似乎仍在引用对象,并且未对其进行垃圾收集。
有人知道可以防止这种情况发生的解决方案吗?有一些选择,例如遍历我的1000倍规格中的每一个,并添加afterEach
一些清理功能,但这似乎是很多工作。
这是我大部分测试的样例布局
describe('MyClassCtrl', function() { var $httpBackend, $rootScope, ctrl; ctrl = $rootScope = $httpBackend = null; beforeEach(function() { module('myApp'); inject(function($controller, $rootScope, _$httpBackend_, $stateParams) { var $scope; $stateParams.id = 1; $httpBackend = _$httpBackend_; $scope = $rootScope.$new(); ctrl = $controller('MyClassCtrl', { $scope: $scope }); }); }); describe('#_getMyList', function() { beforeEach(function() { $httpBackend.expectGET("/my/app/url").respond({ my_list: [1, 2, 3] }); ctrl._getMyList(); $httpBackend.flush(); }); it('does this', function() { expect(ctrl.my_list).to.eql([1, 2, 3]); }); }); });
以下是一些分析屏幕截图:
更新
通过将我it
的一个包裹在一个循环中,我能够触发内存泄漏。
例如:
for (i = 0; i < 200; i++) { it('does this', function() { expect(ctrl.my_list).to.eql([1, 2, 3]); }); }
在我的测试中,我将所有对象的容器对象中,并在清理它afterEach
(如解决方案在这里),但没有运气。Chrome的开发时间轴工具上的内存分配仍在不断增加。
谢谢!