Flask测试:测试应用程序请求?

7
在做Miguel Grinberg的Flask Web Development时,我在测试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()?

2个回答

4
在这个主题上有很多阅读材料,因此可以从文档开始: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创建RequestContext对象而不是request_context时,你得到的是一个EnvironBuilder对象


0

在这里查看tbicr的答案。

具体来说,这段代码:

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

需要请求上下文,因为它需要访问“request”变量。

User Model中gravatar方法的定义需要“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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接