如何使用$ resource测试工厂,该工厂在AngularJS中返回一个承诺?

时间:2016-03-15 14:54:09

标签: javascript angularjs unit-testing jasmine karma-jasmine

在我的Angular应用程序中,我的controller定义如下:

angular.module('myApp.controllers')
  .controller('AppController', function($rootScope, $scope, CheckResource) {
    $scope.check = function(data) {
      var promise = CheckResource.query(data).$promise;
      promise.then(function(result) {
         $scope.value = result;
      }, function() {
         $scope.value = "default";
      });
    };
  };

我的CheckResourceFactory,如下所示:

angular.module('myApp.services', ['ngResource'])
  .factory('CheckResource', function($resource) {
    return $resource('/check', {}, {
      query: {
        method: 'POST'
      }
    });
  });

我想为我的控制器AppController编写一个单元测试,并以某种方式模拟我的工厂CheckResource,但我不知道如何使用$q来实现这一目标和延期承诺。任何人都可以向我解释一下这种情况会发生什么?

我有什么选择来测试这种情况?我应该嘲笑我的服务吗?我应该使用spyOn吗?我应该使用$httpBackend吗?或者,我应该进行E2E测试吗?

2 个答案:

答案 0 :(得分:0)

假设你的测试中有一个模拟器,你可以这样做:

var deferred;

beforeEach(inject(function($q) {
    deferred = $q.defer();

    myController.CheckResource = {
        query: function() {
            return {$promise: deferred.promise};
        }
    };
}));

然后在你的测试中:

it('tests CheckResource', function() {
     deferred.resolve([]);
     expect(something).toHaveHappened();
});

答案 1 :(得分:-1)

ngResource在单独的模块中定义。请查看文档http://docs.angularjs.org/api/ngResource换句话说,您必须在MyApp.Factory模块中包含和添加ngResource依赖项 - angular.module(“MyApp.Factory”,[“ngResource”])

var factory;

beforeEach(function () {

  module("MyApp.Factory");

  inject(function (_factory_) {
    factory = _factory_;
  });

});