3

我正在尝试使用 Jasmine 间谍来测试在 $resource 上调用查询的控制器。当我按如下方式编写对资源的调用时,我可以获得成功的测试(下面链接的 plunk 中的实现 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?

点击这里查看

4

1 回答 1

2

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

它应该是这样的(至少要让你的两个实现都工作)。

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

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

于 2014-08-09T14:49:22.573 回答