2013-10-21 19 views
28

'da çalışan açısal testlerde nasıl çalışır? Geri bildirim için belki de çok fazla konsol günlüğü kullanmayı seviyorum ve bazen kural olarak çalışıyorum; kural olarak, bazen direktif/hizmet/denetleyicide $ timeout ekledik; 500 ms, ve şimdi birim testi sırasında sorun, ben doğrudan const.logs altında altta karma ve ekrana çıktı gönderilen const.logs fark ettim.zamanaşımı, karma

konsol günlüklerini zaman aşımının altında ya da $ zaman aşımı altındaki sarılmış varsayımlar altında, yok sayılırsa sonuç çıkmaz, zaman aşımına çözüm nedir?

cevap

88

Ünite testlerinde, orignal'in $timeout modelinin üzerine yazdığı ngMock'u yüklersiniz. Mock $timeout, gerçek JavaScript timeout gibi çalışmıyor. İçindeki kodu çağırmak için, birim testinizden $timeout.flush() yapmalısınız.

$timeout gerçek timeout gibi çalıştıysa, $timeout kullanan tüm işlevler için eşzamansız birim testleri yazmanız gerekirdi.

İşte $timeout kullanan basitleştirilmiş bir fonksiyonun bir örnek ve bunu sınamak nasıl:

gaApi.getReport = function() { 
    report = $q.defer() 

    $timeout(function() { 
    $http({method: 'GET', url: 'https://www.googleapis.com/analytics/v3/data/ga'}) 
     .success(function(body) { 
     report.resolve(body) 
     }) 
    }, 300) 

    return report.promise 
} 

bir birim testi: Açısal ekibi bu doğru yazma asenkron testlerinde IMHO

describe('getReport', function() { 
    it('should return report data from Google Analytics', function() { 
    gaApi.getReport().then(function(body) { 
     expect(body.kind).toBe('analytics#gaData') 
    }) 

    $timeout.flush() 
    $httpBackend.flush() 
    }) 
}) 
+6

emer. 'flush() 'FTW. – weltschmerz

+1

Testten sonra $ timeout.flush kullanan bir makaleye rastladım. Bu yaklaşımdaki fark nedir? http://jasonwatmore.com/post/2015/03/06/AngularJS-Unit-Testing-code-that-uses-$timeout.aspx – Winnemucca