2016-01-22 81 views
1

在課堂內部,我使用VK API。在測試過程中,我在API中使用MagicMock來模擬授權此類使用:如何添加虛擬方法

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' 

如何嘲笑這東西是否正確?

謝謝!

+0

你爲什麼要嘲笑它,如果你希望它返回用戶返回無? –

+0

添加users.get屬性的正確方法是什麼? 我試圖添加:mock_vk_values = [{'uid':user.vk_uid}] \ attrs = {'users.get.return_value':mock_vk_values} \ vk.API = MagicMock(name ='api',** attrs)但它沒有幫助。 – paus

+0

我添加了一些邏輯來開始我試圖使用。 – paus

回答

0

試試這個:

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) 
+0

在我的情況下,嘗試執行vk.API.users.get()返回: 。它應該返回ID列表。 – paus

+0

對不起,雖然API的實例在類的內部創建 - 它可以正常工作。 – paus