Angular + Mocha内存泄漏

Gus*_*ias 5 memory-leaks mocha.js angularjs

运行整套测试时出现以下错误:

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]);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

以下是一些分析屏幕截图:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

更新

通过将我it的一个包裹在一个循环中,我能够触发内存泄漏。

例如:

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

在我的测试中,我将所有对象的容器对象中,并在清理它afterEach(如解决方案在这里),但没有运气。Chrome的开发时间轴工具上的内存分配仍在不断增加。

谢谢!

oli*_*ren 0

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

如果这是使用Sinon,我希望您在测试之前创建一个存根/间谍并在测试之后清理它(或在沙箱中运行它)。

尝试在运行测试之前和之后拍摄堆快照,并比较快照以查找哪些对象的数量持续增加。