4

AsyncHTTPTestCaseを使用して竜巻をテストしようとしています。@tornado.web.authenticatedアノテーションでマークされたハンドラーをテストしたいと思います。このハンドラーには認証が必要なため、最初にログインするか、テストコードで認証されていると考えてだまします。

class HandlerToTest(BaseHandler):
  @tornado.web.authenticated
  def get(self):
    self.render("hello.html", user=self.get_current_user() )

この記事によると、私たちはクッキーをファッジすることができます。私はこれを機能させましたが、Ben Darnell竜巻のメンテナによると、これはお勧めできません。ベンはCookieLibモジュールを使用することをお勧めしますが、それには応答の「情報」部分が必要ですが、これはありません。

別のブログ投稿では、moxを使用してget_current_user()呼び出しをモックすることを提案しています。ただし、ブログのサンプルコードを機能させることができません。

だから私の質問は:認証済みとしてマークされたハンドラーをテストする最良の方法は何ですか?そして、誰かが私にサンプルアプリケーションを教えてもらえますか?

4

3 に答える 3

4

最終的にモックが機能するようになりました。これが「最善の方法」かどうかはわかりませんが、将来誰かに役立つかもしれません。get_current_user()このコードは、2 つのハンドラーをテストし、によって生成された呼び出しをモックし@tornado.web.authenticatedます。

# encoding: utf-8
import os, os.path, sys
import tornado.web
import tornado.testing
import mox

class BaseHandler(tornado.web.RequestHandler):
    def get_login_url(self):
        return u"/login"

    def get_current_user(self):
        user_json = self.get_secure_cookie("user")
        if user_json:
            return tornado.escape.json_decode(user_json)
        else:
            return None

class HelloHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self):
        self.render("protected.html")


class Protected(tornado.web.RequestHandler):
    def get_current_user(self):
        # get an user from somewhere
        return "andy"

    @tornado.web.authenticated
    def get(self):
        self.render("protected.html")


class TestAuthenticatedHandlers(tornado.testing.AsyncHTTPTestCase):
    def get_app(self):
        self.mox = mox.Mox()
        app = tornado.web.Application([
            (r'/protected', Protected),
            (r'/hello', HelloHandler)
        ])
        return app

    def tearDown(self):
        self.mox.UnsetStubs()
        self.mox.ResetAll()

    def test_new_admin(self):
        self.mox.StubOutWithMock(Protected, 'get_current_user', use_mock_anything=True)
        Protected.get_current_user().AndReturn("test_user")
        self.mox.ReplayAll()
        resp = self.fetch('/protected')
        self.assertEqual(resp.code, 200)
        self.mox.VerifyAll()

    def test_hello_page(self):
        self.mox.StubOutWithMock(HelloHandler, 'get_current_user', use_mock_anything=True)
        HelloHandler.get_current_user().AndReturn("test_user")
        self.mox.ReplayAll()
        resp = self.fetch('/hello')
        self.assertEqual(resp.code, 200)
        self.assertIn( "Hello", resp.body )
        self.mox.VerifyAll()
于 2012-06-07T18:14:55.510 に答える
0

この Torando utils ライブラリでは、認証済みハンドラーをテストすることもできます: tornado_utils/http_test_client.py

于 2012-11-22T14:57:57.893 に答える