Javascript 嘲笑茉莉花的承诺

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:

我试图编写jasmine单元测试来测试angular控制器,但遇到了一些问题,其中注入了一个服务,并返回了一个承诺

我有一个从服务器检索数据的服务:

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(){}});