簡體   English   中英

angularjs茉莉花承諾測試

[英]angularjs jasmine promise testing

我正在嘗試測試我的登錄控制器,該控制器應將用戶的登錄名/密碼發送到服務,並說出服務中是否存在該用戶名。 這是我的代碼:

    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”函數中的測試從未執行。 即使在這些條件下,它也可以通過所有測試。

這是因為您正在測試異步代碼,所以您需要使用以下方法使測試異步:

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

        });
    });

完成使它等待承諾解決/拒絕。 如果它在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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM