使用Jasmine spyOn和$ resource

时间:2014-08-09 11:52:57

标签: angularjs jasmine spy

我正在尝试使用Jasmine间谍来测试在$资源上调用查询的控制器。当我按照以下方式编写对资源的调用时,我可以获得成功的测试(下面链接的插件中的实现1)

function($scope, bagelApiService) {
      bagelApiService
        .query()
        .$promise
        .then(function(bagelsResponse) {
          $scope.bagels = bagelsResponse;
          $scope.somethingAfterBagelsLoad = true;
        });
    }

但我宁愿像这样调用资源(下面链接的plunk中的实现2)

 function($scope, bagelApiService) {
   bagelApiService.query(function(bagelsResponse) {
       $scope.bagels = bagelsResponse;
       $scope.somethingAfterBagelsLoad = true;
     });
 }

这是我的规范

describe('BreakfastCtrl', function() {
  var $q,
  $rootScope,
  _scope,
  mockBagelsResponse = [{name: 'foobagel'}, {name: 'barbagel'}];

  beforeEach(module('BreakfastApp'));

  beforeEach(inject(function($controller, $q, $rootScope, bagelApiService) {
    _scope = $rootScope.$new();

    var queryDeferred = $q.defer();

    spyOn(bagelApiService, 'query').andReturn({$promise: queryDeferred.promise});

    $controller('BreakfastCtrl', {
      '$scope': _scope,
      'bagelApiService': bagelApiService
    });

    queryDeferred.resolve(mockBagelsResponse);
    $rootScope.$apply();
  }));


  it('should set scope.bagels', function() {
    expect(_scope.bagels).toEqual(mockBagelsResponse);
  });

});

任何想法为什么实现2未通过测试(即使它运行正常),以及如何编写测试以通过实现2?

click here for plunk

1 个答案:

答案 0 :(得分:2)

这是因为你没有完全模仿query()

它应该是这样的(至少使你的两个实现都有效)。

spyOn(bagelApiService, 'query').andCallFake(function (callback) {
  queryDeferred.promise.then(callback);
  return { $promise: queryDeferred.promise };
});

示例Plunker: http://plnkr.co/edit/wGAytf5ASSJwut4WUwGO?p=preview