簡體   English   中英

燒瓶測試:測試應用程序請求?

[英]Flask Testing: Test App Request?

在做Miguel Grinberg的Flask Web開發時,我在測試gravatar代碼時遇到困難,

def test_gravatar(self):
    u = User(email='john@example.com', password='cat')
    with self.app.test_request_context('/'):
        gravatar = u.gravatar()
        gravatar_256 = u.gravatar(size=256)
        gravatar_pg = u.gravatar(rating='pg')
        gravatar_retro = u.gravatar(default='retro')
    with self.app.test_request_context('/', base_url='https://example.com'):
        gravatar_ssl = u.gravatar()
    self.assertTrue('http://www.gravatar.com/avatar/' +
                    'd4c74594d841139328695756648b6bd6'in gravatar)
    self.assertTrue('s=256' in gravatar_256)
    self.assertTrue('r=pg' in gravatar_pg)
    self.assertTrue('d=retro' in gravatar_retro)
    self.assertTrue('https://secure.gravatar.com/avatar/' +
                    'd4c74594d841139328695756648b6bd6' in gravatar_ssl)

app.test_request_context()做什么以及它與app_context()的不同之處是什么?

為什么我們甚至需要使用self.app.test_request_context('/')進行調用? 另外,我們可以做些什么更改來將調用轉移到SetUp()中的app.test_request_context()?

關於這個主題有很多閱讀,所以從文檔開始: app_contexttest_request_context ,你總是可以仔細檢查代碼: app_contexttest_request_context 另外, 這里有一篇文章討論Flask的背景。

這是很多鏈接,所以要分解:

我們可以看到app_context創建了一個新的應用程序上下文,而test_request_context創建了一個新的請求上下文。 應用程序上下文在兩種情況下創建:手動使用app_context和創建請求上下文,而請求上下文又是使用test_request_context創建的,或者是在請求開始時創建的

因此,當請求進入您的應用程序時 ,會創建一個RequestContext 創建此對象會創建應用程序上下文。

為什么test_request_context 在請求創建的上下文之外工作時,您需要該上下文來訪問應用程序,例如您可能識別的代理 ,例如current_apprequestgsession 深入到代碼中,當您使用test_request_context而不是request_context創建EnvironBuilder ,您將獲得一個EnvironBuilder對象

在這里查看tbicr的答案。

具體來說,這段代碼

gravatar = u.gravatar()
gravatar_256 = u.gravatar(size=256)
gravatar_pg = u.gravatar(rating='pg')
gravatar_retro = u.gravatar(default='retro')

需要請求上下文,因為它需要訪問'request'變量。

用戶模型中的重力方法定義需要“請求”變量。

def gravatar(self, size=100, default='identicon', rating='g'): 
        if request.is_secure: # here
            url = 'https://secure.gravatar.com/avatar' 
        else:  
            url = 'http://www.gravatar.com/avatar' 
        hash = self.avatar_hash or hashlib.md5(self.email.encode('utf-8')).hexdigest() 
        return '{url}/{hash}?s={size}&d={default}&r={rating}'.format(url=url, hash=hash, size=size, default=default, rating=rating)

暫無
暫無

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

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