我正在使用 jsonapi-serializer 库反序列化 API 数据。我使用 angular 的 $q 构造函数 promise 了回调并将其包装在服务中,这在浏览器上运行良好,但是当我在 karma runner 上使用 jasmine 测试它时, promise 没有解决。这是服务上的方法(注意我使用的是 TypeScript)
public deserialize(type: string, data: any): any {
// get the predefined options for resource type
let deserializeOpts: any = this.deserializeOpts[type];
// use jsonapi-serializer
// the options are not working
let deserializer: any = new JAS.Deserializer({});
console.log(data);
// return a promise with the parsed object
return 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);
}
});
});
}
这是我尝试调试一段时间后的测试
it('should flatten jsonapi user', function (done) {
var deserialized;
JsonapiParser.deserialize(type, apiUser).then(
(result) => {
deserialized = result;
expect(deserialized).toEqual(apiUser);
done();
}
);
});
这是上述反序列化器服务的示例使用
// returns the promise so controller can display the errors
return 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
方法,我可以看到回调得到解决,但 promise 似乎永远不会消化。如果我在调用 resolve 之后放置一个 $rootScope.$digest() ,测试会工作,但我不想在那里硬编码,特别是因为代码在部署时工作。
最佳答案
您接近 $rootScope.$digest()
,但是不是从应用代码触发摘要,而是从测试中触发 $rootScope.$apply()
.
关于javascript - AngularJS - 用 $q promise 的函数在测试中没有解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438927/