测试用户注册函数触发AssertionError,请求排查原因及解决方法
问题:用户注册测试触发AssertionError
测试用户注册相关函数时触发AssertionError,错误信息如下:
AssertionError: ({'errors': {'_schema': ['Invalid input type.']}}, 422) != {'Message': 'New user Created'}
相关代码
注册路由函数
def user_register(): request_data = request.get_json() insert = service_register(request_data) print(type(insert)) return insert
注册服务函数
def service_register(request_data): print("Into Register") try: data_dict = validate_data(request_data) except ValidationError as errors: return{"errors": errors.messages}, 422
数据校验函数
def validate_data(request_data): print("data", request_data) get_data = user_schema.load(request_data) print("1111",type(get_data)) return get_data
UserSchema定义
from marshmallow import Schema, fields, validates, ValidationError, validate import datetime # User Schema class UserSchema(Schema): print("Schema") user_name = fields.String(required= True, validate=validate.Length(min=5)) password = fields.String(required = True) email_address = fields.String() dob = fields.DateTime() address = fields.String() uid = fields.UUID(error_messages={'null': 'Sorry, Id field cannot be null', 'invalid_uuid': 'Sorry, Id field must be a valid UUID'}) print("access") @validates('dob') def is_not_in_future(self, value): now = datetime.datetime.now() if value > now: raise ValidationError("Can't create notes in the future!") class Meta: fields = ('id', 'user_name', 'password', 'email_address', 'dob', 'address', 'uid')
测试用例
def test_service_reg_return_correct_data(self): data = { #dict "user_name": "testuser39", "password": "123456", "email_address":"testuser39@example.com", "dob": "2022-06-07 00:00:00", "address": "Ahmedabad", "uid": uuid.uuid4().hex } json_data = json.dumps(data) m = mock.MagicMock() m.get_json.return_value = json_data print("m", m) with mock.patch("backened.routes.register.request", m): response =user_register() self.assertEqual(response, {'Message': 'New user Created'},201)
问题排查与解决方法
核心问题分析
- Mock数据格式错误:
request.get_json()默认返回解析后的Python字典,但测试中把字典转成了JSON字符串(json.dumps(data)),Marshmallow的load()方法无法解析字符串,直接抛出Invalid input type错误。 - 服务函数逻辑缺失:
service_register只处理了校验失败的分支,校验成功后没有返回预期的{'Message': 'New user Created'}和201状态码。 - UID格式不匹配:测试用例中
uuid.uuid4().hex生成的是无连字符的字符串,而Marshmallow的UUID字段要求标准带连字符的UUID格式(如550e8400-e29b-41d4-a716-446655440000),这也会触发校验失败。
修正步骤
1. 修正Mock数据格式
去掉json.dumps(),直接传递Python字典给get_json.return_value:
def test_service_reg_return_correct_data(self): data = { "user_name": "testuser39", "password": "123456", "email_address":"testuser39@example.com", "dob": "2022-06-07 00:00:00", "address": "Ahmedabad", "uid": str(uuid.uuid4()) # 生成标准带连字符的UUID } m = mock.MagicMock() m.get_json.return_value = data with mock.patch("backened.routes.register.request", m): response = user_register() # 注意:需要匹配返回的元组格式(响应内容, 状态码) self.assertEqual(response, ({'Message': 'New user Created'}, 201))
2. 完善服务函数的成功分支
在service_register中补充校验成功后的返回逻辑:
def service_register(request_data): print("Into Register") try: data_dict = validate_data(request_data) # 校验成功后返回预期响应和201状态码 return {'Message': 'New user Created'}, 201 except ValidationError as errors: return{"errors": errors.messages}, 422
3. 确认UserSchema实例化
确保代码中user_schema是UserSchema的实例,而非类本身:
# 全局或合适的位置定义 user_schema = UserSchema()
内容的提问来源于stack exchange,提问作者Naveen Pandia
相关产品推荐
相关产品推荐

