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

原文 标签 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!';
      });
    }
  };
});


以及以下茉莉花测试:

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()方法的函数返回““我访问了Google!”?

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

最佳答案

您快要准备好了,您只需要做几件事。


在apiFactory.call方法中,您应该返回$ http.get()。这将向呼叫者返回承诺。
您需要添加某种检查,以验证是否从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 - 如何使用选择标签过滤ui-gmap-markers

javascript - 如何创建一个有角度的数据传输对象并将其发送到后端?

javascript - 使用一个“ it”测试两个具有相同功能的期望

javascript - 以错误的方式获取JSON数据。

javascript - 单击后退按钮时如何避免Ajax重新加载

javascript - Javascript SecurityError:访问cookie时DOM异常18

javascript - 离子微调框未显示

javascript - 在提供者配置中对$ urlRouterProvider.other进行单元测试

javascript - 使用Jasmine测试工厂时如何模拟$ compile函数

javascript - 使用Bluebird Promise返回2个变量