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

我在工厂中有以下代码:

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 angularjs jasmine promise

相关文章:

javascript - jQuery函数忽略类

javascript - amp-story已被注册。 amp-story的脚本标签可能在页面中包含两次

asp.net - 如何使用JavaScript更改asp.net文本框的文本属性

php - 是否检查并在生成的数据中不打印JavaScript?

javascript - 如何将React组件放在HTML字符串中?

javascript - Angular 2:如何从subscribe http.post获得响应后调用函数

javascript - 等到forEach循环完成?

javascript - 为何javascript无法将其写回到html文件中?

javascript - Knockout.js ViewModel更改回调?

javascript - 如何防止浏览器后退按钮显示我的用户通知?