我有一個AngularJS項目,它使用Karma在瀏覽器中運行一些單元測試。我使用摩卡作爲測試框架。但是,我有一些規範測試需要閱讀一些JSON文件,並檢查它們是否遵守給定的約定規範(類型,名稱約定等)。
我應該說清楚它是我想測試的這些文件的實際內容。不是通過Angular Mock的$httpBackend
他們的欺騙版本。
我正在標記用於karma.conf.js
服務的JSON文件。
files: [
{ pattern: 'static/assets/json/cards/*.json', included: false, served: true },
'path/to/angular.js',
'path/to/angular-mocks.js',
'tests/**/*.js'
]
如果我跑karma start
,我可以瀏覽到/base/static/assets/json/cards/something.json
並看到文件被提供。
接下來,在我的測試中,$http
和$q
服務都被注入。
var $http, $q;
beforeEach(module('chai'));
beforeEach(inject(function(_$http_, _$q_) {
$http = _$http_;
$q = _$q_;
}));
然後我嘗試使用$http.get
加載每個資源。最後,從$http.get
返回的承諾進行整理,並致電$q.all
以便等待它們全部完成,然後致電done()
並繼續前進。
it('should load the resources', function(done) {
var promises = ['admissions.json', 'discharge.json']
.map(function(resource) {
console.log('Loading', resource);
return $http.get('/base/static/assets/json/cards/' + resource);
});
$q.all(promises)
.then(function(card) {
console.log('Success');
done();
}, function(err) {
console.log('Failure', err);
done();
});
});
當我的測試運行,我看到下面的控制檯輸出:
Loading admissions.json
Loading discharge.json
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
起初我認爲它可能已被超過的花費很長的時間來加載超時,但該文件只95KB。
接下來,我想知道對於$http
自定義承諾接口(.success
和.error
)是否被打破$q.all
方法。但顯然不是。
最後,我試着在所有測試開始時對/base/static/assets/json/cards/admissions.json
做出獨立請求。
它按照預期返回一個承諾,但它永遠不會被解決,因爲沒有響應被髮回。我查看了網絡工具,看看會發生什麼事情,事實證明,這個請求甚至不在首位。代碼肯定會運行,但由於某種原因$http
實際上並未提出請求。
我的意見是,這是與角度模擬攔截$http
請求它自己的$httpBackend
服務。我怎樣才能繞過這個?