wie man die Template-Variablen, die vom webapp2 request handler an das jinja2 template übergeben wurden, unittest

Ich habe noch nie Unit-Tests durchgeführt. Ich will es meistern.

Ich versuche meine webapp2-Handler zu testen. Zu diesem Zweck hielt ich es für eine gute Idee, eine Anfrage an den Handler zu senden, z.

<code>request = webapp2.Request.blank('/')
# Get a response for that request.
response = request.get_response(main.app)
</code>

Das Problem ist, dass die Antwort meistens nur eine Menge HTML usw. ist.

Ich möchte sehen, was vom Handler an meine jinja2-Vorlage übergeben wurde, bevor sie in HTML umgewandelt wurde.

Ich möchte, dass mein Test den Status innerhalb des Handler-Klassencodes erreicht. Ich möchte nicht sehen, wie bestimmte Variablen im Response-Handler aussahen, und möchte dann sehen, wie die Diktatvorlagen aussehen, bevor sie an render_to_response () übergeben wurden.

Ich möchte testen, ob diese Variablen die richtigen Werte haben.

Hier ist mein Testcode, aber ich stecke fest, weil response = request.get_response () mir nur eine Menge HTML und nicht die rohen Variablen gibt.

<code>import unittest
#from google.appengine.ext import db
#from google.appengine.ext import testbed
#from google.appengine.datastore import datastore_stub_util
import main
import webapp2

class DemoTestCase(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testNothing(self):
        self.assertEqual(42, 21 + 21)

    def testHomeHandler(self):
        # Build a request object passing the URI path to be tested.
        # You can also pass headers, query arguments etc.
        request = webapp2.Request.blank('/')
        # Get a response for that request.
        response = request.get_response(main.app)

        # Let's check if the response is correct.
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.body, 'Hello, world!')


if __name__ == '__main__':
    unittest.main()
</code>

Und hier ist mein Handler:

<code>class HomeHandler(BaseHandler):
    def get(self, file_name_filter=None, category_filter=None):
        file_names = os.listdir('blog_posts')
        blogs = []

        get_line = lambda file_: file_.readline().strip().replace("<!--","").replace("-->","")

        for fn in file_names:
            with open('blog_posts/%s' % fn) as file_:
                heading = get_line(file_)
                link_name = get_line(file_)
                category = get_line(file_)

            date_ = datetime.strptime(fn.split("_")[0], "%Y%m%d")

            blog_dict = {'date': date_, 'heading': heading,
                         'link_name': link_name,
                         'category': category,
                         'filename': fn.replace(".html", ""),
                         'raw_file_name': fn}

            blogs.append(blog_dict)

        categories = Counter(d['category'] for d in blogs)
        templates = {'categories': categories,
                     'blogs': blogs,
                     'file_name_filter': file_name_filter,
                     'category_filter': category_filter}

        assert(len(file_names) == len(set(d['link_name'] for d in blogs)))

        self.render_template('home.html', **templates)
</code>

Und hier ist mein Basehandler:

<code>class BaseHandler(webapp2.RequestHandler):
    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_template(self, filename, **kwargs):
        #kwargs.update({})
        #TODO() datastore caching here for caching of (handlername, handler parameters, changeable parameters, app_upload_date)
        #TODO() write rendered page to its own html file, and just serve that whole file. (includes all posts). JQuery can show/hide posts.
        self.response.write(self.jinja2.render_template(filename, **kwargs))
</code>

Vielleicht habe ich eine falsche Vorstellung davon, wie man Unit-Tests durchführt, oder sollte ich meinen Code so schreiben, dass er einfacher zu testen ist? Oder gibt es eine Möglichkeit, den Status meines Codes zu ermitteln?

Auch wenn jemand den Code neu schreiben und die Variablennamen ändern würde, würden die Tests abbrechen.

Bitte informieren Sie mich über meine Situation: X

Antworten auf die Frage(2)

Ihre Antwort auf die Frage