При запуске всего набора тестов я получаю следующую ошибку:
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]);
});
});
});
Ниже приведены некоторые скриншоты профилирования:
UPDATE
Мне удалось вызвать утечку памяти, просто обернув один из моих it
в цикле.
например:.
for (i = 0; i < 200; i++) {
it('does this', function() {
expect(ctrl.my_list).to.eql([1, 2, 3]);
});
}
В моих тестах я установил все объекты внутри объекта-контейнера и очистил его в afterEach
(например, решение здесь), но не повезло. Распределение памяти по-прежнему увеличивается в инструменте Chrome Dev Timeline.
Спасибо!