2013-05-01 23 views
30

điều khiển của tôi có mã như dưới đây:

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

Và trong các thử nghiệm đơn vị của tôi tôi đang làm một cái gì đó như thế này:

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; 
}); 

Bây giờ trong thử nghiệm của tôi tôi đang kiểm tra nếu dịch vụ này được gọi là và data1, data2 không được xác định ..

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(); 
}); 

vấn đề của tôi là, điều này đã hoạt động tốt cho đến khi tôi thay thế các cuộc gọi dịch vụ riêng lẻ trong bộ điều khiển bằng q.all và trong kiểm tra scope.$apply với rootScope.$digest. Với q.all và rootScope.$digest (cố gắng sử dụng scope.$apply cũng) cả hai thử nghiệm thất bại với lỗi:

10 $digest() iterations reached. Aborting!

nếu tôi loại bỏ rootScope.$digest sau đó những lời hứa không bao giờ có được giải quyết và kiểm tra thất bại nói

expected undefined to be defined.

Bất kỳ sự giúp đỡ như thế nào nên tôi kiểm tra đơn vị mã với q.all?

đi qua this post

Nhưng điều đó cũng không giúp gì như tôi đã cố gắng sử dụng $digest.

Trả lời

61

Bạn có thể thử đặt $rootScope.$apply() vào chức năng gọi lại afterEach(). Hứa hẹn giải quyết trên $apply() trong Góc.

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

Trong trường hợp bạn tự hỏi đâu mà ghi: [Sự khác nhau giữa Kris Kowal của Q và $ 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() đã làm thủ thuật cho tôi – Mikey

+14

'$ áp dụng 'thường nhận được một cuộc gọi lại. Tôi thích 'scope. $ Digest()', chỉ tiêu hóa phạm vi hiện tại, vì vậy có hiệu năng tốt hơn. –

Các vấn đề liên quan