2014-11-03 180 views
0

我正在尝试编写茉莉花单元测试来测试角度控制器,并遇到已注入服务并返回承诺的问题。嘲笑茉莉花承诺

我有一种从服务器获取数据的服务:

app.factory('LookupService', ['$resource', '$http', '$cookies', 
function ($resource, userId) { 
    return $resource('./Controller/GetFunction', {}, { 
     query: { method: 'GET', params: { userId: userId }, isArray: true } 
    }); 
}]); 

被称为控制器:

$scope.returnedDataStore = lookupService.get({ userId: $scope.userId }); 
$scope.returnedDataStore.$promise.then(function (result) { 
    $scope.processData(result.data); 
}); 

在我的单元测试,我下面注入该服务:

beforeEach(function() { 
    module('app'); 

    lookupService = jasmine.createSpyObj('LookupService', ['get']); 

    inject(function ($rootScope, $controller, $q) { 
     $scope = $rootScope.$new(); 

     var deferred = $q.defer(); 
     lookupService.get.and.returnValue(deferred.promise); 

     ctrl = $controller('myController', { 
      $scope: $scope, 
      LookUpService: lookupService 
     }); 
    }); 
}); 

但是,当在控制器中调用服务时,我收到一个错误,指出错误阿泰说$scope.returnedDataStore.$promise未定义:未定义

我已经搜查了很多试图解决这个问题,但我并没有多少运气

无法读取属性“然后”。

如果有人能指出我正确的方向,我会非常感激!

回答

0

我通常做的是 - 在服务

手柄承诺并返回承诺对象控制器,看看它有助于您:

describe('Controller: mainCtrl', function() { 
    beforeEach(module('myApp')); 

    var mainCtrl, 
     scope, 
     someService, 
     spyGetSomething; 


    beforeEach(inject(function($controller, $rootScope) { 
     someService = { 
      getSomething: function() {} 
     }; 

     spyGetSomething = spyOn(someService, 'getSomething').andReturn({ 
      then: function() {} 
     }); 

     mainCtrl = $controller('mainCtrl', { 
      $scope: scope, 
      SomeService: someService 
     }); 
    }); 
    ... 

    it('Should call SomeService.getSomething() ', function() { 
     expect(spyGetSomething).toHaveBeenCalled(); 
    }); 


}); 

(注:没有测试)

+0

谢谢!我设法通过嘲笑承诺对象,如上所述。以供将来参考我的代码,原先为: lookupService.get.and.returnValue({ \t \t \t \t $承诺: \t \t \t \t { \t \t \t \t \t则:函数(){ \t \t \t \t \t \t \t \t \t \t \t} \t \t \t \t} \t \t \t}); – Loki 2014-11-03 12:32:59