AngularJS - 使用$ q实现的函数在测试时无法解析

时间:2016-04-05 23:37:46

标签: javascript angularjs angular-promise json-api

我正在使用jsonapi-serializer库来反序列化API数据。我使用angular的$ q构造函数进行回调并将其包装在服务中,这在浏览器上工作正常,但是当我在karma运行器上使用jasmine测试它时,promise无法解决。这是服务上的方法(注意我使用的是TypeScript)

id

经过一段时间的尝试调试后,这是我的测试

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; }); 方法中登录,我可以看到回调得到解决,但承诺似乎永远不会消化。如果我在解析调用之后放置$ rootScope。$ digest(),测试工作,但我不想在那里硬编码,特别是因为代码在部署时工作。

2 个答案:

答案 0 :(得分:2)

您与$rootScope.$digest()关系密切,但不是从应用代码触发摘要,而是使用$rootScope.$apply()从测试中触发摘要。

请参阅Testing PromisesService Testing

答案 1 :(得分:0)

  

这在浏览器上运行正常

我无法相信。你永远不会打电话给resolve!而不是

console.log(resolve);

你需要使用

console.log(result);
resolve(result);

顺便说一下,典型的node-style callback promisification使用的是if (err),而不是if (result)。也许你想要if (err || !result)