运行整个测试套件时出现以下错误:
超过2000毫秒的超时.确保在此测试中调用done()回调.
经过一番调查,我发现是一个内存泄漏问题.查看一些堆分析快照,仍然可以引用对象并且不会收集垃圾.
有人知道一个可以防止它发生的解决方案吗?有一些选项,比如浏览我的1000个规格中的每一个,并添加afterEach来做一些清理,但这似乎很多工作.
这是我的大多数测试的样本布局
describe('MyClassCtrl',function() { var $httpBackend,$rootScope,ctrl; ctrl = $rootScope = $httpBackend = null; beforeEach(function() { module('myApp'); inject(function($controller,_$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,3]); }); }); });
以下是一些分析截图:
@L_403_1@
UPDATE
我能够通过简单地将其中一个包裹在一个循环中来触发内存泄漏.
例如.:
for (i = 0; i < 200; i++) { it('does this',function() { expect(ctrl.my_list).to.eql([1,3]); }); }
在我的测试中,我在容器对象中设置所有对象并在afterEach中清理它(如解决方案here)但没有运气. Chrome的Dev Timeline工具的内存分配仍在不断增加.
谢谢!