angularjs – Angular Mocha内存泄漏

前端之家收集整理的这篇文章主要介绍了angularjs – Angular Mocha内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
运行整个测试套件时出现以下错误

超过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]);
    });
  });
});

以下是一些分析截图:

enter image description here

@L_403_1@

enter image description here

UPDATE

我能够通过简单地将其中一个包裹在一个循环中来触发内存泄漏.

例如.:

for (i = 0; i < 200; i++) {
  it('does this',function() {
    expect(ctrl.my_list).to.eql([1,3]);
  });
}

在我的测试中,我在容器对象中设置所有对象并在afterEach中清理它(如解决方here)但没有运气. Chrome的Dev Timeline工具的内存分配仍在不断增加.

谢谢!

解决方法

我没有看到你清理你的模拟http后端.我不知道它是如何运作的,但我希望你的所有请求和响应都存储在内存中.这将导致它逐渐增加,通过测试进行测试.

如果这是使用Sinon我会期望你在测试之前创建一个存根/间谍并在之后清理它(或者在沙盒中运行它).

尝试在运行测试之前和之后获取堆快照,并对快照进行区分以查找哪些对象的数量不断增加.

猜你在找的Angularjs相关文章