对测试$ promise感到困惑

时间:2015-05-20 21:40:16

标签: angularjs unit-testing karma-jasmine

我正在测试一个控制器,它有一个从我的服务器返回一个json对象的方法。我真的很困惑如何对我的方法返回的方式做出预期。

我需要根据结果清理一下我的范围。

我想要完成的是呼叫搜索() - >看看返回的数据 - >如果长度== 0 - >确保我的范围已删除某些值。如何查看我的方法返回的内容?

$scope.clearIds = function(){  
     //clean out data I don't need anymore
   }

   $scope.search = function(inputValue, modelname, action, field){
    modelname = modelname || 'companies';
    action = action || 'search';
    field = field || 'title';

    return apiResource.query({api_resource:modelname, api_action:action, api_column:field, api_value:inputValue}).$promise.then(function(response){
     if(response.data.length === 0){   
       $scope.clearIds();
     }
     else{
      return response.data;
    }
  });
  }

  describe('Controller - TypeaheadSearch', function () {

    // load the controller's module
    beforeEach(module('app'));

    var scope;
    var apiResource;
    var stateParams;
    var q;
    var deferred; 
    var rootScope;

    // Initialize the controller and a mock scope
    beforeEach(inject(function ($controller, $rootScope, $q) {

      apiResource = {
        query: function() {
          deferred = $q.defer();
          deferred.resolve('bar');
          return deferred.promise;
        }
      };
      scope = $rootScope.$new();
      stateParams = {};
      q = $q;
      rootScope = $rootScope;
      $controller('TypeaheadSearch', {
        $scope: scope,
        $stateParams:stateParams,
        apiResource: apiResource,
      });
    }));

    it('Should call apiResource:query', function() {

      spyOn(apiResource, 'query').and.callThrough();
      scope.search();
      rootScope.$apply();
      expect(apiResource.query).toHaveBeenCalled();
    });
  });

1 个答案:

答案 0 :(得分:0)

为$ scope.clearIds()然后expect(scope.clearIds).toHaveBeenCalled()创建一个间谍,和/或检查clearIds()是否具有您想要的效果。

接下来,使用类似于您的代码所期望的数据来解决假承诺。 在您的(it())测试中执行此操作,以便您可以看到代码如何响应不同的数据(例如,返回包含其中某些内容的数组)。

deferred.resolve({data: []});