【问题标题】:How can I make a Jasmine test for AngularJS which works with $resource?如何为与 $resource 一起使用的 AngularJS 进行 Jasmine 测试?
【发布时间】:2016-01-19 08:08:19
【问题描述】:

我有一个从服务器获取用户数组的服务:

    function getUsers() {
        var UsersResource = $resource('assets/data/users.json', {}, {
            query: {
                method: "GET",
                isArray: true
            }
        });

        var users = UsersResource.query().$promise;
        return users;
    }

    function signIn(loginField, password) {
        return getUsers()
            .then(function(users) {
                for (var i = 0; i < users.length; i++) {
                    if (users[i].login == loginField && users[i].password == password) {
                        $rootScope.logged = true;
                        $rootScope.user = users[i].login;
                        $location.path('/courses');
                        return true;
                    }
                }
                return false;
            })
            .catch(function () {
                console.log("Error: Users array wasn't retrieved from the server");
                return false;
            });
    }

现在我正在尝试以这种方式对其进行测试(是的,它实际上是对控制器的测试,它引用了该服务):

describe('LoginController', function() {
    beforeEach(module('task6'));

    var $rootScope, $controller, LoginService;

    beforeEach(inject(function(_$rootScope_, _$controller_, _LoginService_) {
        $rootScope = _$rootScope_;
        $controller = _$controller_;
        LoginService = _LoginService_;
    }));

    describe('LoginController.submitLogin', function() {
        it('tests if such user exists', function(done) {
            var $scope = $rootScope.$new();
            var controller = $controller('LoginController', {$scope: $scope});
            controller.loginField = 'John';
            controller.password = 'Smith';
            LoginService.signIn(controller.loginField,
                                controller.password)
            .then(function(logged) {
                expect(false).toBe(true);
                done();
            })
            $scope.$digest();
        });
    });
});

但它不起作用:“错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调。” 而且我不明白我做错了什么。 :)

附:或者如果我可以测试控制器本身会更好,它可以与服务一起使用:

self.submitLoginForm = function() {
        LoginService.signIn(self.loginField, self.password)
            .then(function(logged) {
                if(!logged) {
                    self.loginError = true;
                }
            })
            .catch(console.log.bind(console));
    };

【问题讨论】:

    标签: angularjs testing resources jasmine promise


    【解决方案1】:

    你需要用$httpBackend模拟http请求

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      相关资源
      最近更新 更多