【问题标题】:How to mock AngularJS $resource with $promise.then in jasmine如何在茉莉花中使用 $promise.then 模拟 AngularJS $resource
【发布时间】:2016-06-08 05:21:21
【问题描述】:

我有一个使用 Angular 资源进行 API 调用的工厂。然后我创建了一个名为 getObjectById 的函数,并使用工厂查询该对象,然后在返回之前修改该对象。

服务:

return getObjectById: function(id) {
   return objectFactory.getById({ id: id }).$promise.then(function(response) {
      return modifyObject(response.object);
   });
}

我想测试 modifyObject() 是否正常工作,但 modifyObject 是私有函数。

所以为了测试它,我试图模拟响应对象工厂返回的带有间谍的对象。

测试:

beforeEach(function() {
   inject(function(objectFactory, $q) {
      spyOn(objectFactory, 'getById').and.returnValue({ $promise: $q.when(readJSON('test/resources/object.json'))});
   });
});

但每次我运行测试时都会出现错误:

TypeError: 无法读取未定义的属性“returnValue”

如果我能得到任何帮助以使其正常工作,那就太好了。甚至建议我的布局是否错误。使用最新版本的 Jasmine

【问题讨论】:

  • .and. 语法是从 Jasmine 2.0 开始的,您使用的是 2.* 版本吗?
  • 是的,我正在使用最新版本的 Jasmine

标签: angularjs unit-testing jasmine promise


【解决方案1】:

这是一个很晚的答案,但我刚刚在 AngularJS / Angular 混合应用程序中遇到了同样的问题。我们使用的是 jasmine v1,但是输入了 jasmine v2 打字。这意味着 TypeScript 无法使用 v1 语法编译,但会因TypeError: Cannot read property 'returnValue' of undefined 而失败。

茉莉版本需要匹配打字:

"karma-jasmine": "0.1" 表示 jasmine v1,需要"@types/jasmine": "^1.3.0"

"karma-jasmine": "0.3" 是 jasmine v2 并且需要 "@types/jasmine": "2.8"

【讨论】:

    【解决方案2】:

    你缺少右括号

    spyOn(objectFactory, 'getById').and.returnValue({ $promise: $q.when(readJSON('test/resources/object.json'))});
    

    【讨论】:

      猜你喜欢
      • 2015-05-27
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多