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

如何基于抽象类编写Django Rest Framework的单元测试?

解决方案

首先修正你测试代码中的语法错误,然后调整测试方法对类属性的引用方式,就能实现基类写测试、子类仅修改变量复用测试用例的需求。

步骤1:修正语法与引用问题

你的测试代码存在语法错误和变量引用问题,以下是修正后的完整实现:

import unittest
from abc import ABC
# 导入你的业务类,替换成实际模块名
from your_app.models import Vehicule, Car, Bike

# 抽象测试基类,添加skip避免被单独执行
@unittest.skip("抽象测试基类,无需直接运行")
class TestVehicule(ABC, unittest.TestCase):
    # 定义子类需要覆盖的类属性
    wheel = None
    roof = None
    factory = None

    @classmethod
    def setUpClass(cls):
        # 前置检查:确保子类必须设置factory属性
        if cls.factory is None:
            raise NotImplementedError("所有子类必须设置factory属性")

    def test_wheel_count(self):
        # 引用子类的factory和wheel属性进行断言
        self.assertEqual(self.factory.wheel, self.wheel)

    def test_roof_existence(self):
        self.assertEqual(self.factory.roof, self.roof)

# 汽车测试子类,仅覆盖必要属性
class TestCar(TestVehicule):
    wheel = 4
    roof = True
    factory = Car  # 如果是工厂类,替换为CarFactory

# 自行车测试子类
class TestBike(TestVehicule):
    wheel = 2
    roof = False
    factory = Bike  # 如果是工厂类,替换为BikeFactory

关键说明

  1. 语法修正:TestCar和TestBike类定义末尾添加冒号:,这是Python类定义的必要语法。
  2. 变量引用:测试方法中使用self.factory、self.wheel来引用类属性,子类会自动覆盖基类的这些属性,测试时会使用子类的值。
  3. 抽象基类处理:给TestVehicule添加@unittest.skip装饰器,防止测试运行器把它当成可执行的测试用例;setUpClass中的检查可以确保子类不会遗漏必要的属性设置。
  4. 工厂类适配:如果你的CarFactory是用来创建实例的工厂(而非直接引用Car类),只需调整测试方法中的逻辑:
    def test_wheel_count(self):
        # 实例化对象后测试属性
        vehicle = self.factory.create()  # 假设工厂有create方法
        self.assertEqual(vehicle.wheel, self.wheel)
    

运行测试

当你运行测试时,测试框架会自动执行TestCar和TestBike中的所有测试方法,且各自使用子类定义的属性值。

内容的提问来源于stack exchange,提问作者Kanarpp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:43:26