jak odznaczyć zmienne szablonu przekazane do szablonu jinja2 z procedury obsługi zgłoszeń webapp2

Nigdy wcześniej nie przeprowadzałem testów jednostkowych. Chcę to opanować.

Próbuję przetestować moje programy obsługi webapp2. Aby to zrobić, pomyślałem, że dobrym pomysłem będzie wysłanie żądania do obsługi, np .:

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

Problem polega na tym, że odpowiedź jest w większości tylko zbiorem HTML itp.

Chcę sprawdzić, co zostało przekazane do mojego szablonu jinja2 z programu obsługi, zanim został on przekształcony w HTML.

Chcę, aby mój test dotarł do stanu w kodzie klasy obsługi. Nie będę w stanie zobaczyć, jak niektóre zmienne wyglądały w procedurze obsługi odpowiedzi, a następnie chcę zobaczyć, jak wyglądają szablony dykt, zanim zostały przekazane do render_to_response ()

Chcę przetestować te zmienne, które mają poprawne wartości.

Oto mój kod testowy do tej pory, ale utknąłem, ponieważ response = request.get_response () daje mi tylko kilka html, a nie surowych zmiennych.

<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>

a oto mój przewodnik:

<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>

a oto mój bazowy:

<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>

Być może mam zły pomysł na testowanie jednostkowe, a może powinienem napisać kod w taki sposób, aby ułatwić testowanie? czy jest jakiś sposób na uzyskanie stanu mojego kodu?

Także jeśli ktoś miałby przepisać kod i zmienić nazwy zmiennych, to testy by się załamały.

proszę o poinformowanie mnie o mojej sytuacji: X

questionAnswers(2)

yourAnswerToTheQuestion