Javascript 嘲笑茉莉花的承诺
我试图编写jasmine单元测试来测试angular控制器,但遇到了一些问题,其中注入了一个服务,并返回了一个承诺 我有一个从服务器检索数据的服务:Javascript 嘲笑茉莉花的承诺,javascript,angularjs,unit-testing,jasmine,promise,Javascript,Angularjs,Unit Testing,Jasmine,Promise,我试图编写jasmine单元测试来测试angular控制器,但遇到了一些问题,其中注入了一个服务,并返回了一个承诺 我有一个从服务器检索数据的服务: app.factory('LookupService', ['$resource', '$http', '$cookies', function ($resource, userId) { return $resource('./Controller/GetFunction', {}, { query: { method:
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
未定义:
无法读取未定义的属性“then”
为了解决这个问题,我做了很多努力,但运气不太好
如果有人能给我指出正确的方向,我将不胜感激 我通常做的是- 在服务中处理promise并将promise对象返回给controller,看看它是否对您有帮助:
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();
});
});
(注意:没有测试)谢谢!我通过模仿上面提到的promise对象成功地实现了它。为了将来参考,我的代码现在读作:lookupService.get.and.returnValue({$promise:{then:function(){}});