2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
我使用庫(kù)中的patch裝飾器實(shí)現(xiàn)了這一點(diǎn)unittest.mock。
auth.py
...
from flask_restful import Resource, reqparse
from firebase_admin import auth
class Token(Resource):
def __init__(self):
self.parser = reqparse.RequestParser()
self.parser.add_argument('token', type=str, required=True)
# route for /api/auth/token
def post(self):
args = self.parser.parse_args()
try:
firebase_user = auth.verify_id_token(args['token'])
except Exception:
abort(401)
# use firebase_user
test_auth.py
from unittest import mock
mock_firebase_user = {
'user_id': 'firebasegenerateduserid',
'email': 'testuser@gmail.com',
# ... add more firebase return values
}
# client is from conftest.py
def test_auth(client):
with mock.patch('auth.auth.verify_id_token') as magic_mock:
magic_mock.return_value = mock_firebase_user
post_data = {
'token': 'firebaserusertokenid'
}
response = client.post('/api/auth/token', data=post_data)
assert response.status_code == 200

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
將邏輯放在接口后面。
class TokenVerifier(object):
def verify(self, token):
raise NotImplementedError()
class FirebaseTokenVerifier(TokenVerifier):
def verify(self, token):
return auth.verify_id_token(token)
class MockTokenVerifier(TokenVerifier):
def verify(self, token):
# Return mock object that will help pass your tests.
# Or raise an error to simulate token validation failures.
然后確保在單元測(cè)試期間您的代碼使用MockTokenVerifier.
還可以創(chuàng)建模擬 ID 令牌,并存根部分 Admin SDK,以便auth.verify_id_token()在測(cè)試期間正常運(yùn)行(請(qǐng)參閱SDK 的單元測(cè)試)。但我更喜歡上面的解決方案,因?yàn)樗?jiǎn)單、更干凈,并且不需要弄亂 SDK 的內(nèi)部結(jié)構(gòu)。
添加回答
舉報(bào)