我正在使用jsonapi-serializer庫來反序列化API數(shù)據(jù)。我使用angular的$ q構(gòu)造函數(shù)進(jìn)行回調(diào)并將其包裝在服務(wù)中,這在瀏覽器上工作正常,但是當(dāng)我在karma運行器上使用jasmine測試它時,promise無法解決。這是服務(wù)上的方法(注意我使用的是TypeScript)public deserialize(type: string, data: any): any {// get the predefined options for resource typelet deserializeOpts:
any = this.deserializeOpts[type];// use jsonapi-serializer// the options are not workinglet deserializer:
any = new JAS.Deserializer({});console.log(data);// return a promise with the parsed objectreturn this._$q((resolve: any, reject: any) => {
deserializer.deserialize(data, (err: any, result: any) => {
if (result) {
console.log(resolve);
resolve(result);
} else {
console.log(err);
reject(err);
}
});});}經(jīng)過一段時間嘗試調(diào)試后,這是我的測試it('should flatten jsonapi user', function (done) {
var deserialized;
JsonapiParser.deserialize(type, apiUser).then(
(result) => {
deserialized = result;
expect(deserialized).toEqual(apiUser);
done();
}
);});這是所提到的解串器服務(wù)的示例用法// returns the promise so controller can display the errorsreturn this.$http.get(url)
.then(
(response: any) => {
if (response.data.data.length !== 0) {// deserialize data
return this._deserializer.deserialize('activities', response.data) // the deserializer service is called;
} else { // throw an error if data is empty
return this.$q.reject({ error: this.ACTIVITY.empty });
}
},
() => {
return this.$q.reject({ error: this.ACTIVITY.connectionError });
}
).then(
(deserialized: any) => { // data is copied to original list so it doesn't lose it's bindings
angular.copy(deserialized, this.list); // the result from the deserializer is used
console.log(deserialized);
return this.list;
});編譯并在瀏覽器上運行時,最后一段代碼可以正常工作。但測試得到了超時。如果我在deserialize方法中登錄,我可以看到回調(diào)得到解決,但承諾似乎永遠(yuǎn)不會消化。如果我在調(diào)用解決后放置$ rootScope。$ digest(),測試工作,但我不想在那里硬編碼,特別是因為代碼在部署時工作。
AngularJS - 使用$ q實現(xiàn)的函數(shù)在測試時無法解析
慕村225694
2019-04-15 17:15:19