Jasmine单元测试异步控制器方法

时间:2014-06-30 19:34:18

标签: angularjs unit-testing asynchronous jasmine jasmine2.0

我使用Jasmine对一个Angular控制器进行单元测试,该控制器有一个异步运行的方法。我能够成功地将依赖项注入到控制器中,但我不得不改变处理异步的方法,因为我的测试将在数据加载之前运行。我目前正在尝试监视模拟依赖项并使用andCallThrough(),但导致错误TypeError: undefined is not a function

这是我的掌控者......

myApp.controller('myController', function($scope, users) {
    $scope.user = {};

    users.current.get().then(function(user) {
        $scope.user = user;
    });
}); 

和我的test.js ......

describe('myController', function () {
    var scope, createController, mockUsers, deferred;
    beforeEach(module("myApp"));

    beforeEach(inject(function ($rootScope, $controller, $q) {
        mockUsers = {
            current: {
                get: function () {
                    deferred = $q.defer();
                    return deferred.promise;
                }
            }
        };
        spyOn(mockUsers.current, 'get').andCallThrough();

        scope = $rootScope.$new();
        createController = function () {
            return $controller('myController', {
                $scope: scope,
                users: mockUsers
            });
        };
    }));


    it('should work', function () {
        var ctrl = createController();          
        deferred.resolve('me');
        scope.$digest();
        expect(mockUsers.current.get).toHaveBeenCalled();
        expect(scope.user).toBe('me');           
    });
});

如果有更好的方法进行此类测试,请告诉我,谢谢。

1 个答案:

答案 0 :(得分:4)

尝试

spyOn(mockUsers.current, 'get').and.callThrough();

取决于您使用的版本:在较新版本上,CallThroungh()位于对象内部。 这里是文档http://jasmine.github.io/2.0/introduction.html

相关问题