如何模拟在初始化中实例化的类属性?

2024-05-19 12:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想嘲笑self.api.朋友.get“VKAuth类中的方法:

import vk

class VKAuth(object):
    def __init__(self, access_token, user):
        self.session = vk.Session(access_token = access_token)
        self.api = vk.API(self.session)

    def follow(self):
        vk_friends = self.api.friends.get()

从测试模块测试_视图.py公司名称:

^{pr2}$

在上述基于SNView类的视图中对“auth social”的post调用期间创建了VKAuth类的实例:

class SNView(generics.GenericAPIView):
    serializer_class = serializers.AuthSocialSerializer
    permission_classes = (rest_permissions.IsAuthenticated)

    def post(self, request, backend, *args, **kwargs):
        s = self.get_serializer(data=request.DATA)

        if s.is_valid():
            auth_backends = {
                'vk': VKAuth,
                'facebook': FBAuth
            }

            if backend in auth_backends:
                auth_backend = auth_backends[backend](access_token=s.data['access_token'], user=self.request.user)

我得到一个错误:

AttributeError: <class 'accounts.auth_backends.vk_backend.VKAuth' doens't have the attribute 'api'

我应该写什么面片.object达到api.friends.get嘲笑它?

升级版:

更准确地说,我想要一些等价物:

    auth_token = 'ceeecdfe0eb4bf68ceeecdfe0eb4bf68ceeecdfe0eb4bf68652530774ced6cbc8cba0'
    user = User.objects.get(id = 2)
    vk_auth = VKAuth(auth_token, user)

    vk_ids=[111111,2222222,3333333,44444444]
    vk_auth.authenticate()
    vk_auth.api.friends = MagicMock(name='get', return_value=None)
    vk_auth.api.friends.get = MagicMock(name='get', return_value=vk_ids)
    data = vk_auth.follow()

但是在我们通过self.client.post(). 在

谢谢你!在


Tags: selftokenauthapibackendgetaccessdef
1条回答
网友
1楼 · 发布于 2024-05-19 12:24:16

你在修补错误的东西。在VKAuth中:

self.api = vk.API(self.session)

api属性添加到VKAuthself对象。当你打电话的时候

^{pr2}$

您正在修补VKAuth类的api静态属性,而不是object属性。在

您应该改为修补vk.API。在

with patch('vk.API', autospec=True) as mock_api:
    response = self.client.post(reverse('auth-social', kwargs=dict(backend='vk')), dict(access_token=auth_token), follow=True)

注意事项:

  1. 只有当您真正知道为什么需要它时才使用^{},而不是简单的patch。在
  2. autospec=True不是必需的,而是I strongly encourage to use it。在
  3. patch上下文中,self.api将等于mock_api.return_value,因为调用vk.API(self.session)与调用{}相似;换句话说,mock_api是用来替换{}引用的模拟对象。在
  4. 看看where to patch,你会发现它非常有用。在

现在,如果您想通过某种行为填充mock_api.return_value,可以在with上下文中配置它:

with patch('vk.API', autospec=True) as mock_api:
    m_api = mock_api.return_value
    m_api.friends.return_value = None
    m_api.friends.get.return_value = vk_ids
    .... Your test

相关问题 更多 >