Angular 在模拟茉莉花测试中使用 then 回调

Angular with then callback in mock jasmine test

嗨,我想知道是否有人可以告诉我如何在 angular 和 jasmine 2 的模拟测试中测试回调结果。我们有一个服务,它的调用只是 returns一些数据,看起来像这样:

var getStuff = function (id) {
     return $http.get("url/" + id)
                .then(function (response) {
                    return response.data;
                });
        }; 

在我们的控制器中,我们在启动时调用此服务:

angular.module('controllers').controller("myController", ['$scope',  'service', function ($scope, service) {

    var onGetStuff = function(data) {
        //do something with the result here 
    }

    $scope.getItems = function() {
        service.getStuff(1).then(onGetStuff);
    }


    $scope.getItems();
}]);

然后我 运行 我的测试(稍后会 post 代码,但是从未调用过 onGetStuff 的调用,我似乎无法弄清楚为什么。这是测试代码:

//includes here

describe('Controller: Applicant Controller', function () {

    var controller, $q, $scope, mockService, deferred, $rootScope;

    beforeEach(module("controllers"));

beforeEach(function() {
        mockService = {
            getStuff: function (id) {
                deferred = $q.defer();
                deferred.resolve({somestuff: 1});
                return deferred.promise;
            }
        };

        spyOn(mockService, 'getStuff').and.callThrough();
});

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

        controller = $controller('myController', {
            $scope: $scope,
            service: mockService
        });
 }));


    it("it should work", function () {
        debugger;
    });

});

如果我在 chrome 中单步执行调试器,模拟服务会被调用,但我的控制器中的 "onGetStuff" 调用从未被调用,有人能找出原因吗?

谢谢 嘲讽。

创建控制器后,您需要调用 $rootScope.$apply() 以便 运行 任何 then 回调。