2013-05-01 4 views
30

Мой контроллер имеет код, как показано ниже:

$q.all([qService.getData($scope.id), dService.getData(), qTService.get()]) 
.then(function (allData) { 
    $scope.data1 = allData[0]; 
    $scope.data2 = allData[1]; 
    $scope.data3 = allData[2]; 
}); 

И в моих модульных тестов я делаю что-то вроде этого:

beforeEach(inject(function($rootScope, $q, $location){// and other dependencies... 
    qServiceSpy = spyOn(_qService, 'getData').andCallFake(function() { 
    var data1 = { 
     id: 1, 
     sellingProperty: 1, 
    }; 
    var d = $q.defer(); 
    d.resolve(data1); 
    return d.promise; 
    }); 

    dServiceSpy = spyOn(_dService, 'getData').andCallFake(function() { 
    var data2 = [{ "id": "1", "anotherProp": 123 }]; 
    var d = $q.defer(); 
    d.resolve(data2); 
    return d.promise; 
    }); 
    qTServiceSpy = spyOn(_qTService, 'get').andCallFake(function() { 
    var data3 = [{ id: 0, name: 'Rahul' }]; 
    var d = $q.defer(); 
    d.resolve(data3); 
    return d.promise; 
    }); 
    rootScope = $rootScope; 
}); 

Сейчас в моем тесте я проверка, если услуги называются и data1, data2 не неопределенный ..

it('check if qService' got called, function() { 
    expect(scope.data1).toBeUndefined(); 
    rootScope.$digest(); 
    expect(_quoteService.getQuote).toHaveBeenCalled(); 
}); 
it('check if "data1" is defined', function() { 
    expect(scope.data1).toBeUndefined(); 
    rootScope.$digest(); 
    expect(scope.data1).toBeDefined(); 
}); 

моя проблема, это работает отлично, пока я не заменил свои индивидуальные вызовы службы в контроллере с q.all и в тестах scope.$apply с rootScope.$digest. С q.all и rootScope.$digest (попытался с помощью scope.$apply а) оба теста с ошибкой:

10 $digest() iterations reached. Aborting!

если я удалить rootScope.$digest тогда обещания никогда не Разрешает и тесты терпит неудачу, говоря

expected undefined to be defined.

Любая помощь, как должен ли я тестировать код с q.all?

попадались this post

Но это также не помогает, как я уже пытался использовать $digest.

ответ

61

Вы можете попробовать поставить $rootScope.$apply() в функцию обратного вызова afterEach(). Обещания разрешаются на $apply() в Угловом.

afterEach(function(){ 
    rootScope.$apply(); 
}); 
+3

В случае вам интересно, где это, что документированные: [Различия между Kris Коваля в Q и $ Q] (http://docs.angularjs.org/api/ng/service/$q#differences-between-kris- kowal-sq-and-q) & [testing] (http://docs.angularjs.org/api/ng/service/$q#testing) –

+1

$ scope.apply() сделал трюк для меня – Mikey

+14

'$ apply 'обычно получает обратный вызов. Я предпочитаю 'scope. $ Digest()', который только переваривает текущую область, поэтому имеет лучшую производительность. –