如何基于抽象类编写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
关键说明
- 语法修正:
TestCar和TestBike类定义末尾添加冒号:,这是Python类定义的必要语法。 - 变量引用:测试方法中使用
self.factory、self.wheel来引用类属性,子类会自动覆盖基类的这些属性,测试时会使用子类的值。 - 抽象基类处理:给
TestVehicule添加@unittest.skip装饰器,防止测试运行器把它当成可执行的测试用例;setUpClass中的检查可以确保子类不会遗漏必要的属性设置。 - 工厂类适配:如果你的
CarFactory是用来创建实例的工厂(而非直接引用Car类),只需调整测试方法中的逻辑:def test_wheel_count(self): # 实例化对象后测试属性 vehicle = self.factory.create() # 假设工厂有create方法 self.assertEqual(vehicle.wheel, self.wheel)
运行测试
当你运行测试时,测试框架会自动执行TestCar和TestBike中的所有测试方法,且各自使用子类定义的属性值。
内容的提问来源于stack exchange,提问作者Kanarpp
相关产品推荐
相关产品推荐

