signalsを使用してこれを行うことができます。私はここで、コードsnippitを再現します:ここでは
import unittest
from app import app
from flask import template_rendered
from contextlib import contextmanager
@contextmanager
def captured_templates(app):
recorded = []
def record(sender, template, context, **extra):
recorded.append((template, context))
template_rendered.connect(record, app)
try:
yield recorded
finally:
template_rendered.disconnect(record, app)
class TestFoo(unittest.TestCase):
def test_foo(self):
with app.test_client() as c:
with captured_templates(app) as templates:
r = c.get('/foo/')
template, context = templates[0]
self.assertEquals(context['foo'], 'bar')
は
template
一部を削除し、イテレータに変換します別の実装です。
import unittest
from app import app
from flask import template_rendered
from contextlib import contextmanager
@contextmanager
def get_context_variables(app):
recorded = []
def record(sender, template, context, **extra):
recorded.append(context)
template_rendered.connect(record, app)
try:
yield iter(recorded)
finally:
template_rendered.disconnect(record, app)
class TestFoo(unittest.TestCase):
def test_foo(self):
with app.test_client() as c:
with get_context_variables(app) as contexts:
r = c.get('/foo/')
context = next(context)
self.assertEquals(context['foo'], 'bar')
r = c.get('/foo/?foo=bar')
context = next(context)
self.assertEquals(context['foo'], 'foo')
# This will raise a StopIteration exception because I haven't rendered
# and new templates
next(context)
単語「バー」は 'foo'は「バー」 –
編集以外に設定された場合でも、HTMLのどこにもレンダリングされた場合、これは偽陽性を返します。すべては用途に依存します。もちろん、それを達成するために多くのトリックを使うことができますが、単純にすることができれば、それはなぜですか? – turkus
私はあなたの意見を見ます。私が投稿した回答は、醜いもので、合計で12行あり、それがどのように動作するかを知るためには、信号のドキュメントを読む必要があります。あなたのものは1つのライナーです。私はあなたの答えがバックエンドの単体テストにビューを結合していると主張していると思います。たとえば、将来あなたが "hello"から "hi"に変更された場合は、テストでも同様に行う必要があります。 –