Python 如何添加虚拟方法

Python 如何添加虚拟方法,python,django,unit-testing,mocking,python-mock,Python,Django,Unit Testing,Mocking,Python Mock,在类内部,我使用VKAPI。在测试期间,我使用MagicMock在该类使用的API中模拟授权: vk.Session = MagicMock(name='session', return_value=None) vk.API = MagicMock(name='api') mock_vk_values = [{'uid': user.vk_uid}] vk.API.users.get = MagicMock(name='uid', return_value=moc

在类内部,我使用VKAPI。在测试期间,我使用MagicMock在该类使用的API中模拟授权:

    vk.Session = MagicMock(name='session', return_value=None)
    vk.API = MagicMock(name='api')
    mock_vk_values = [{'uid': user.vk_uid}]
    vk.API.users.get = MagicMock(name='uid', return_value=mock_vk_values)
但是,在类内部,我使用此API获取用户的uid:

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

      def authenticate(self):
          try:
              vk_uid = self.api.users.get()[0]['uid']
在这个地方会出现一个错误:

*** AttributeError: 'NoneType' object has no attribute 'users'
如何嘲笑这些东西

谢谢大家!

试试这个:

试试这个:


如果希望它返回用户,为什么要模拟它返回None?添加users.get属性的正确方法是什么?我试图添加:mock_vk_values=[{'uid':user.vk_uid}]\attrs={'users.get.return_value':mock_vk_values}\vk.API=MagicMock(name='API',**attrs)但它没有帮助。我在开始尝试使用时添加了一些逻辑。如果希望它返回用户,为什么要将其模拟为不返回?添加用户的正确方法是什么。获取属性?我尝试添加:mock_vk_values=[{'uid':user.vk_uid}]\attrs={'users.get.return_value':mock_vk_values}\vk.API=MagicMock(name='API',**attrs),但没有帮助。我在开始尝试使用的内容时添加了一些逻辑。在我的例子中,尝试执行vk.API.users.get()返回:。它应该返回ID列表。很抱歉,当API实例在类内部创建时,它工作正常。在我的示例中,尝试执行vk.API.users.get()返回:。它应该返回ID列表。对不起,当API实例在类内部创建时,它工作正常。
vk.Session = MagicMock(name='session', return_value=None)
mock_vk_values = [{'uid': user.vk_uid}]
# create an explicit mock for the users attribute
users_mock = MagicMock(name='users')
users_mock.get = MagicMock(name='uid', return_value=mock_vk_values)
# create a mock for the api
api_mock = MagicMock(name='api', users=users_mock)
# this is where a lot of people get mocking wrong -
# mistaking the mock of a constructor with the object returned/created
vk.API = MagicMock(return_value=api_mock)