在pytest-django测试中如何为响应添加organizer字段以通过测试
如何让LeadSerializer响应返回organizer字段?
我是测试新手,折腾了一天还没解决这个问题:系统里有organizer和agent两类用户,只有organizer能创建Lead,创建时会把认证用户关联到organizer字段,但当前的LeadSerializer没包含这个字段,导致测试用例无法通过,想让API响应返回organizer字段。
现有代码
LeadSerializer代码
class LeadSerializer(serializers.ModelSerializer): def create(self, validated_data): user = self.context['user'] return Lead.objects.create(organizer=user.organizeruser, **validated_data) class Meta: model = Lead fields = ['id', 'first_name', 'last_name', 'age', 'agent', 'category', 'description', 'date_added', 'phone_number', 'email', 'converted_date' ]
测试代码
def test_if_lead_exist_return_200(self, api_client, leads_factory, user_factory): user = user_factory.create(is_organizer=True) api_client.force_authenticate(user=User(is_staff=True)) lead = leads_factory.create() serializer = LeadSerializer(context={'request': user}) print(serializer) # here I can see the user response = api_client.get(f'/api/leads/{lead.id}/', ) assert response.status_code == status.HTTP_200_OK assert response.data == { 'id': lead.id, 'first_name': lead.first_name, 'last_name': lead.last_name, 'age': lead.age, 'organizer': lead.organizer.id, 'agent': lead.agent.id, 'category': lead.category.id, 'description': lead.description, 'date_added': lead.date_added, 'phone_number': lead.phone_number, 'email': lead.email, 'converted_date': lead.converted_date, }
解决方案
方法1:直接在序列化器字段列表中添加organizer
这是最直接的方式,因为关联字段默认序列化后会返回对应对象的ID,刚好匹配测试用例的预期:
class LeadSerializer(serializers.ModelSerializer): def create(self, validated_data): user = self.context['user'] return Lead.objects.create(organizer=user.organizeruser, **validated_data) class Meta: model = Lead fields = ['id', 'first_name', 'last_name', 'age', 'agent', 'category', 'description', 'date_added', 'phone_number', 'email', 'converted_date', 'organizer' # 新增organizer字段 ]
方法2:自定义organizer字段(按需扩展)
如果后续需要返回organizer的更多信息(比如用户名),可以显式定义字段:
class LeadSerializer(serializers.ModelSerializer): # 仅返回ID(和默认行为一致) organizer = serializers.PrimaryKeyRelatedField(read_only=True) # 若要返回用户名,可替换为: # organizer = serializers.CharField(source='organizer.username', read_only=True) def create(self, validated_data): user = self.context['user'] return Lead.objects.create(organizer=user.organizeruser, **validated_data) class Meta: model = Lead fields = ['id', 'first_name', 'last_name', 'age', 'agent', 'category', 'description', 'date_added', 'phone_number', 'email', 'converted_date', 'organizer' ]
测试用例补充修正
另外注意测试代码里的认证逻辑有误,应该用创建好的user对象,而不是新建无关的User实例:
api_client.force_authenticate(user=user) # 替换原有的User(is_staff=True)
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

