【问题标题】:angularjs jasmine promise testingangularjs 茉莉花承诺测试
【发布时间】:2023-03-27 05:51:01
【问题描述】:

我正在尝试测试我的登录控制器,它应该将用户的登录名/密码发送到服务并说明它是否存在于服务中。这是我的代码:

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

    var $controller, LoginService;

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

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

但似乎“.then”函数中的测试从未执行过。即使在这些条件下,它也通过了所有测试。

【问题讨论】:

标签: angularjs unit-testing jasmine promise


【解决方案1】:

这是因为您正在测试异步代码,因此您需要使用 done 使测试异步,如下所示...

it('tests if such user exists', function(done) {
            .....
            LoginService.signIn(controller.loginField, 
                            controller.password)
            .then(function(logged) {
                expect(true).toBe(false);
                // done();
            }).catch(function(failure) {
                expect(true).toBe(true);
                done();
            })

        });
    });

done 让它等待 promise 解决/拒绝。 如果在 2 秒内没有解决或拒绝(默认),则测试将失败。

【讨论】:

  • 谢谢!但不知何故,这对我不起作用。我很确定我正在做和你一样的事情,而且我仍然在所有测试中收到“成功”消息...LoginService.signIn(controller.loginField, controller.password) .then(function(logged) { expect(false).toBe(true); }) .catch(function(failure) { expect(true).toBe(false); done(); });
  • 好的,您的测试代码假设 LoginService.signIn 正在返回一个承诺。那是对的吗?也许您可以提供该代码
  • PS 你有没有添加...在 promise 解析中仅表示异步测试已完成
  • 我想这真的是我的问题。 :) 这里是代码 `function signIn(loginField, password) { return getUsers() .then(function(users) { for (var i = 0; i
  • 好的,我将添加另一个答案,向您展示如何从登录函数返回承诺
【解决方案2】:
function signIn(username, password) {
   /// THIS RETURNS A PROMISE BECAUSE $http returns a promise. Thus you can call THEN method on the return value because all promises have a THEN method.
   return $http.post('myserver', {username:username, password:password});
}



// Another approach using $q

function signIn(username, password) {
   var defer = $q.defer();
   if (username==="fred" && password==="mypass") {
        defer.resolve("nice one");
   } else {
        defer.reject("oh dear");
   }
   return defer.promise;
}

这两种方法都返回一个承诺。所以现在,当我调用函数时,我可以在其返回值上调用 THEN(因为返回值是一个承诺)......

signIn("fred", "badpass").then(function(response) {
    console.log(response);
}).catch(function(failure) {
    console.log(failure);
});

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多