1
class Generator(Resource):

    @admin_required
    def get(self):
       pass

ビューに @admin_required デコレーターを追加すると、単体テストが失敗し始め、次のメッセージが表示されます。

RuntimeError: リクエスト コンテキストの外で動作しています

単体テストのためにモックまたはバイパスする方法はありますか?

デコレータは次のとおりです。

def admin_required(func):
    """Requires App Engine admin credentials"""
    @wraps(func)
    def decorated_view(*args, **kwargs):
        if users.get_current_user():
            if not users.is_current_user_admin():
                abort(401)  # Unauthorized
            return func(*args, **kwargs)
        return redirect(users.create_login_url(request.url))
    return decorated_view
4

1 に答える 1

3

users モジュールにパッチを当てるだけです。

from google.appengine.api import users

# ...

@mock.patch.object(users, 'get_current_user')
@mock.patch.object(users, 'is_current_user_admin', return_value=True)
def test_handler(mock_get_current_user, mock_is_current_user_admin):
    invoke_your_handler()
    # make assertions, etc.

さらに深く掘り下げたい場合は、そのGAEテストベッドを使用できます...残念ながら、ここのドキュメントはかなり貧弱で、正しく理解するのが難しいようです...この回答に基づいて、テストベッドインスタンスを作成する必要があるようです次に環境を設定します。

from google.appengine.ext import testbed

testbed = testbed.TestBed()
testbed.activate()
testbed.init_user_stub()
# Sets environment variables...
testbed.setup_env(
    user_email='hello@gmail.com',
    user_id='123456',
    user_is_admin='1',  # '1' is an admin, '0' is a non-admin.
    overwrite=True,
)

通常どおりテストを続行します。をテスト用に使用している場合はunittest、メソッドに楽しいものをすべて詰め込みたいと思うでしょうsetUp

また、環境の汚染を避けるためtestbed.deactivate()に、テストの最後に呼び出す必要があることに注意してください。

于 2015-02-03T00:29:49.327 に答える