2013-07-10 67 views
2

我的UserManager服務每小時自動觸發一次$ http POST刷新用戶訪問令牌。

我試圖嘲笑那個調用來驗證令牌被刷新,但是當我嘗試刷新$ httpbackend時,我得到一個錯誤,說'沒有待處理的請求刷新',即使我知道刷新功能已被調用(添加一個console.log來驗證)。

要麼通過setTimeOut調用函數的事實影響$ httpbackend,要麼我錯過了其他的東西。

代碼附波紋管:

describe("UserManager Service Testing", function() { 

    beforeEach(angular.mock.module('WebApp')); 

    beforeEach(inject(function($httpBackend) { 
     window.apiUrls = jQuery.parseJSON('{"cover_art": "http://myrockpack.com/ws/cover_art/?locale=en-us", "channel_search_terms": "http://myrockpack.com/ws/complete/channels/?locale=en-us", "register": "http://myrockpack.com/ws/register/", "categories": "http://myrockpack.com/ws/categories/?locale=en-us", "reset_password": "http://myrockpack.com/ws/reset-password/", "share_url": "http://myrockpack.com/ws/share/link/", "video_search": "http://myrockpack.com/ws/search/videos/?locale=en-us", "channel_search": "http://myrockpack.com/ws/search/channels/?locale=en-us", "video_search_terms": "http://myrockpack.com/ws/complete/videos/?locale=en-us", "popular_channels": "http://myrockpack.com/ws/channels/?locale=en-us", "popular_videos": "http://myrockpack.com/ws/videos/?locale=en-us", "login": "http://myrockpack.com/ws/login/", "login_register_external": "http://myrockpack.com/ws/login/external/", "refresh_token": "http://myrockpack.com/ws/token/"}'); 
     var mockLogin = {"token_type":"Bearer","user_id":"oCRwcy5MRIiWmsJjvbFbHA","access_token":"752a4f939662846a787a1474ad17ffddcd816dc7AAFB1G7HvgH-0qAkcHMuTESIlprCY72xWxyiuhySCpFJxKVYqOx9W7Gt","resource_url":"http://myrockpack.com/ws/oCRwcy5MRIiWmsJjvbFbHA/","expires_in":2,"refresh_token":"fa2f47f3590240e4bdfdbde03bf8042d"} 
     var refreshToken = {"token_type":"Bearer","user_id":"CeGfSz6dQW2ga2P2tKb3Bg","access_token":"ef235de46dba53ba69ed049f57496ec902da5d28AAFB1HdeTE-2vwnhn0s-nUFtoGtj9rSm9waiuhySCpFJxKVYqOx9W7Gt","resource_url":"http://myrockpack.com/ws/CeGfSz6dQW2ga2P2tKb3Bg/","expires_in":3600,"refresh_token":"873e06747d964a0d80f79181c98aceac"}; 

     $httpBackend.when('POST', window.apiUrls.refresh_token).respond(refreshToken); 
     $httpBackend.when('POST', window.apiUrls.login).respond(mockLogin); 
    })); 

    it('UserManager should refresh the token after 2 seconds', inject(function(UserManager, $httpBackend) { 
     UserManager.oauth.Login('gtest','qweqwe'); 
     $httpBackend.flush(); 
     waits(4000); 
     $httpBackend.flush(); 
     expect(UserManager.oauth.credentials.access_token).toEqual('ef235de46dba53ba69ed049f57496ec902da5d28AAFB1HdeTE-2vwnhn0s-nUFtoGtj9rSm9waiuhySCpFJxKVYqOx9W7Gt'); 
    })); 
}); 

回答

3

有關於這個here的討論。 「既然承諾是異步你需要做的$ rootScope $摘要()在測試中,讓他們去。」

之前,你的$ httpBackend.flush()補充一點:

if(!$rootScope.$$phase) { 
    $rootScope.$apply(); 
} 

使你的代碼變得:所以我的茉莉花測試

it('UserManager should refresh the token after 2 seconds', inject(function(UserManager, $httpBackend) { 
    UserManager.oauth.Login('gtest','qweqwe'); 

    if(!$rootScope.$$phase) { 
     $rootScope.$apply(); 
    } 

    $httpBackend.flush(); 
    expect(UserManager.oauth.credentials.access_token).toEqual('ef235de46dba53ba69ed049f57496ec902da5d28AAFB1HdeTE-2vwnhn0s-nUFtoGtj9rSm9waiuhySCpFJxKVYqOx9W7Gt'); 
})); 
0

我想你必須包裝一個運行(...)塊內的等待下面的代碼。否則,等待已經結束

waits(4000); 
    runs(function() { 
     $httpBackend.flush(); 
     expect(UserManager.oauth.credentials.access_token).toEqual('ef235de46dba53ba69ed049f57496ec902  da5d28AAFB1HdeTE-2vwnhn0s-nUFtoGtj9rSm9waiuhySCpFJxKVYqOx9W7Gt'); 
    }); 

它在茉莉文檔描述,以及在你的代碼,立即執行:https://github.com/pivotal/jasmine/wiki/Asynchronous-specs

0

你的第一個$ httpBackend.flush()刷新所有你所定義的未決請求你的beforeEach()。

當您再次調用$ httpBackend.flush()時,沒有掛起的請求,因此您會收到消息。

您需要在第一次刷新後添加另一個事件。

未經測試,但這是我的理論。

0

所有的時間,有時我不得不使用正則表達式來使URL有點不太具體,最本已與角度想脫光尾隨斜線或其他愚蠢的小事情。如請求網址找不到預期請求,但下面的正則表達式會。

https://qa.com/sessions/5cdec5bde6a242dca2cf5dd0ff7be2c9 

/(qa.com\/sessions\/5cdec5bde6a242dca2cf5dd0ff7be2c9)/g 
相關問題