javascript - AngularJS - 用 $q promise 的函数在测试中没有解析

标签 javascript angularjs angular-promise json-api

我正在使用 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().

参见 Testing PromisesService Testing .

关于javascript - AngularJS - 用 $q promise 的函数在测试中没有解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438927/

相关文章:

javascript - Angular 4 将服务从路由传递到组件

javascript - 每当元素获得该类时,根据类附加点击处理程序

javascript - 这个函数如何知道正在传递哪个属性?

javascript - Angularjs + 使用 $q 的两个 http 请求

javascript - angularjs Controller 中的 Promise - 如何实现

javascript - sails js 上的自定义和多语言消息错误如何解决

angularjs - Fetch as Google 站长工具

javascript - $scope.$watch ...让它在另一个作用域上返回一个函数?

python - Flask CORS - 重定向()上不存在访问控制允许来源 header

javascript - $http 循环请求并在 Angularjs 中组装数据