方法中的模拟变量



我有DRF API视图函数来创建新的消息:

class MessageCreate(generics.CreateAPIView):
"""Create new message by thread id."""
serializer_class = MessageNewSerializer
queryset = Message.objects.all()
def post(self, request, *args, **kwargs):
"""Check that logged-in user is thread."""
thread = Thread.objects.filter(pk=request.data["thread"]).first().participants.all()
user = self.request.user
request.data["sender"] = user.id #need to mock user.id with return value = 2
if not user in thread:
raise ValidationError("You are not in this thread.")
return self.create(request, *args, **kwargs)

为了进行测试,我需要mock(user.id(,返回值为2。但我不明白该如何实施。

class TestMessageCreate(unittest.TestCase):
def setUp(self):
"""Create Theread with two partisipants. Create two users."""
self.user = User.objects.create_user(email="test@test.te", password="test")
self.user2 = User.objects.create_user(email="test2@test.te", password="test2")
self.thread = Thread.objects.create()
def test_message_create(self):
"""Create new Message."""
data = {"text": "from_test", "sender": self.user.id, "thread": self.thread.id}
url = reverse("message-create")
response = self.client.post(url, data=data, format='json')
print(response.json())
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

说明

我认为您需要的是在测试中对用户进行身份验证,以便request.user返回您想要的用户。

解决方案

您可以使用APIClient.force_authenticateAPIClient.login来实现这一点。

def test_message_create(self):
...
# add this line
self.client.force_authenticate(user=self.user2)
response = self.client.post(url, data=data, format='json')
...

最新更新