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的开发时间轴工具上的内存分配仍在不断增加。
谢谢!
我没有看到你清理你的模拟 http 后端。我不知道它是如何运作的,但我希望您的所有请求和响应都存储在内存中。这会导致它逐渐增加,一次又一次的测试。
如果这是使用Sinon,我希望您在测试之前创建一个存根/间谍并在测试之后清理它(或在沙箱中运行它)。
尝试在运行测试之前和之后拍摄堆快照,并比较快照以查找哪些对象的数量持续增加。
| 归档时间: |
|
| 查看次数: |
710 次 |
| 最近记录: |