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

Javascript 如何使用Jasmine测试AngularJS承诺返回的内容?,javascript,angularjs,jasmine,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!'; }); } }; });

我在工厂中有以下代码:

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承诺已被调用,但如何测试传递给
then()
方法的函数是否返回“”我访问了Google!“


这段代码有一个提示:

你就快到了,你只需要做几件事

  • 在apifacture.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!';
    });
    

    这应该对你有用!

    对,你只需调用返回的承诺上的
    then()
    方法(顺便说一句,我忘了在我的示例中添加返回,但我的代码中有它)并检查调用它的参数。我应该想到这一点!非常感谢,回答得很好!