如何添加虚拟方法
How to add the fictive method
里面的class,我用的是VKAPI。在测试期间,我使用 MagicMock 在 API 中模拟授权,此 class 使用:
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)
但是,在 class 内部,我使用这个 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'
如何正确模拟这些东西?
谢谢!
试试这个:
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)
里面的class,我用的是VKAPI。在测试期间,我使用 MagicMock 在 API 中模拟授权,此 class 使用:
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)
但是,在 class 内部,我使用这个 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'
如何正确模拟这些东西?
谢谢!
试试这个:
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)