是否有可能在控制器中测试$ resource成功和错误回调?

时间:2016-11-30 18:47:01

标签: angularjs jasmine

我想在我的控制器中测试$ resource成功和错误回调。我不想使用$ httpBackend,因为它将用于测试数据服务。似乎没有办法做到这一点 - 我找到的唯一解决方案是使用promises而不是我可以解决或拒绝。这听起来不错吗?无论如何,这是我目前所拥有的 - 目前它只测试$ resource get()是否被调用:

控制器:

angular
  .module('myModule')
  .controller('MyCtrl', MyCtrl);

MyCtrl.$inject = [
  'dataService'
];

function MyCtrl(
  dataService
) {
  var vm = this;

  vm.getData = getData;

  function getData() {
    dataService.getData().get(function(response) {
      // stuff to test
    },

    function(error) {
      // stuff to test
    });
  }

测试:

describe('Controller: MyCtrl', function() {
  var MyCtrl;
  var rootScope;
  var scope;
  var dataServiceMock =  {
    getData: jasmine.createSpy('getData')
  };

  beforeEach(function() 
    inject(function($controller, $rootScope) {
      rootScope = $rootScope;
      scope = $rootScope.$new();
      MyCtrl = $controller('MyCtrl as vm', {
        dataService: dataServiceMock,
      });
    });
  });

  describe('vm.getData()', function() {
    beforeEach(function() {
      dataServiceMock.getData.and.returnValue({
        get: jasmine.createSpy('get')
      });
    });

    it('gets the data', function() {
      scope.vm.getData();
      expect(dataServiceMock.getData().get).toHaveBeenCalled();
    });
  });
});

1 个答案:

答案 0 :(得分:0)

试试这个

function getData (query) {
        var deferred = $q.defer();
        var httpPromise = $resource(query,{},{
            post:{
                method:"GET",
                isArray: false,
                responseType: "json"
            }
        });

        httpPromise.post({}, {},
            function(data) {
                try {
                    var results = {}
                    results.totalItems = data.response;
                    deferred.resolve(results);
                } catch (error) {
                    console.log(error.stack);
                    deferred.reject();
                }
            },
            function(error) {
                deferred.reject();
            }
        );

        return deferred.promise;
    }