angularjs - 将 Jasmine spyOn 与 $resource 一起使用

标签 angularjs jasmine spy

我正在尝试使用 Jasmine spy 来测试在 $resource 上调用查询的 Controller 。当我按如下方式编写对资源的调用时,我可以获得成功的测试(下面链接的 plunk 中的实现 1)

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

但我宁愿这样调用资源(下面链接中的实现 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

最佳答案

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

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

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

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

关于angularjs - 将 Jasmine spyOn 与 $resource 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218289/

相关文章:

angular - 如何对作为 viewchild 的函数进行单元测试

javascript - Mocha Sinon 监视导入函数

javascript - 如何在另一个方法中创建的对象上使用 Jasmine spy ?

javascript - 如何将下拉列表值作为参数传递给函数

url - 如何在没有templateUrl的情况下进行路由?

angularjs - 如何在angularjs中重新定义模块?

javascript - 在 AngularJS 中将 XML 解析为 HTML 表

javascript - 应返回的数字是数组中的第一个或最后一个

node.js - Node - 如何测试 stub 依赖项的匿名回调

reactjs - 如何使用 Jest 监视默认导出函数?