javascript - 我如何使用 Jasmine 测试 AngularJS promise 返回的内容?

标签 javascript angularjs jasmine promise

我在工厂中有以下代码:

var app = angular.module('plunker', []);

app.factory('apiFactory', function($http) {
  return {
    'call':function(){
      $http.get('http://www.google.com').then(function(){
        return 'I visited Google!';
      });
    }
  };
});

以及以下 Jasmine 测试:

describe('Testing apiFactory', function() {
  var $scope,
  apiFactory,
  $http,
  $q,
  rootScope;

  beforeEach(module('plunker'));

  beforeEach(inject(function($rootScope, _apiFactory_, _$http_, _$q_, _$rootScope_) {
    apiFactory = _apiFactory_;
    $http = _$http_;
    $q = _$q_;
    rootScope = _$rootScope_;
  }));

  it('should return "I visited Google!"', function(){
    var deferred = $q.defer();
    spyOn($http, 'get').and.returnValue(deferred.promise);
    deferred.resolve();
    apiFactory.call();
    rootScope.$apply();

    expect($http.get).toHaveBeenCalledWith('http://www.google.com');
  });
});

正如您在上面看到的,我知道如何测试 $http.get promise 已被调用,但我如何测试传递给 then() 方法的函数是否返回“”我访问了谷歌!”?

这是此代码的一个plunkr:http://plnkr.co/edit/DrKGV11eTpi2CrtYtffp

最佳答案

您快完成了,您只需要做几件事。

  1. 在 apiFactory.call 方法中,您应该返回 $http.get()。这将向调用者返回 promise 。
  2. 您需要添加某种检查以验证结果是否从 apiFactory.call 方法返回。

我将您的测试修改为如下所示:

it('should return "I visited Google!', function(){
  var deferred = $q.defer();
  var result;

  spyOn($http, 'get').and.returnValue(deferred.promise);
  deferred.resolve();

  apiFactory.call().then(function(resolved) {
    result = resolved;
  });

  expect($http.get).toHaveBeenCalledWith('http://www.google.com');
  expect(result).toBeUndefined();

  rootScope.$apply();

  expect(result).toBe('I visited Google!');
});

澄清一下,您的 apiFactory.call 方法应如下所示:

return $http.get('http://www.google.com').then(function(){
  return 'I visited Google!';
});

这应该适合你!

关于javascript - 我如何使用 Jasmine 测试 AngularJS promise 返回的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27445513/

相关文章:

angularjs - Protractor :测试引导警报

javascript - agGrid - 在列标题名称中显示过滤短语

ruby-on-rails - 如何在 AngularJS 中实现 "Keep me logged in"功能

javascript - 将文本与 Protractor 中的换行符进行比较

javascript - 如何修复 HTML 页面中的 "Google signin"按钮样式?

javascript - 预加载下一张和上一张幻灯片

javascript - 在 HTML5 Canvas 上绘制 X 形状并检查与边框的碰撞

javascript - 单击 Angular 8 滚动到页面顶部

angularjs - 在 AngularJS/karma/jasmine 测试中通过 $http 测试后端 API?

javascript - 测试 $state.go 的自定义方法