Reputation: 7330
I am writing the test case here for CreateUser view but the test is failing. It is throwing the following error
profile_data = validated_data.pop('profile') KeyError: 'profile'
What I am doing wrong here ?Am I doing wrong a=in my view/serializers or my test code is wrong? It creates the users perfectly.
models.py
class Profile(models.Model):
user = models.OneToOneField(get_user_model(),on_delete=models.CASCADE)
address = models.CharField(max_length=250,blank=True,null=True)
contact = models.CharField(max_length=250,blank=True,null=True)
serializers.py
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(required=False)
email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
password1 = serializers.CharField(required=True, write_only=True)
password2 = serializers.CharField(required=True, write_only=True)
class Meta:
model = get_user_model()
fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2', 'profile']
def validate_password1(self, password):
validators.validate_password(password=password)
def validate_password2(self, password):
validators.validate_password(password=password)
def validate(self, data):
if data['password1'] != data['password2']:
raise serializers.ValidationError("The two password fields didn't match.")
return data
# def validate_username(self, validated_data):
# username = validated_data['username']
# print('usr',username)
# if len(username) < 6 and len(username) > 15:
# raise ValidationError('Username must be between 6 and 15 characters long')
# return username
def create(self, validated_data):
user = get_user_model().objects.create(
username=validated_data['username'],
email=validated_data['email'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
)
user.set_password(validated_data['password2'])
user.is_staff = True
user.save()
profile_data = validated_data.pop('profile')
Profile.objects.create(
user=user, address=profile_data['address'], contact=profile_data['contact']
)
return user
views.py
class CreateUser(generics.CreateAPIView):
serializer_class = UserSerializer
queryset = get_user_model().objects.all()
tests.py
class UserCreateListTest(APITestCase):
def setUp(self):
self.client = Client()
def test_create_user(self):
url = reverse('users:create_user')
user = {'first_name':'first','last_name':'last','username':'username','email':'[email protected]',
'password1':'[email protected]','password2':'[email protected]',
"profile": {
"user": 1,
"address": "add",
"contact": "cc"
},
}
response = self.client.post(url,data=user,format='json')
print(response.status_code)
print(response.json())
return self.assertEqual(response.status_code,status.HTTP_201_CREATED)
Upvotes: 0
Views: 116
Reputation: 1249
def setUp(self):
self.client = Client()
this is unnecessary. APITestCase
already provides self.client
which is APIClient
Upvotes: 0
Reputation: 3922
In your test, replace Client
class with rest_framework.test.APIClient
Upvotes: 1