You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试用户注册函数触发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)

问题排查与解决方法

核心问题分析

  1. Mock数据格式错误:request.get_json()默认返回解析后的Python字典,但测试中把字典转成了JSON字符串(json.dumps(data)),Marshmallow的load()方法无法解析字符串,直接抛出Invalid input type错误。
  2. 服务函数逻辑缺失:service_register只处理了校验失败的分支,校验成功后没有返回预期的{'Message': 'New user Created'}和201状态码。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:15:51