如何在django中模拟外部api?

时间:2016-01-13 13:16:24

标签: python django unit-testing mocking python-mock

我正在尝试模拟VKAuth类中的“self.api.friends.get”方法:

jar cf HPLCData.jar *.class
来自测试模块test_views.py的

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()

我在测试过程中遇到错误:

from mock import patch
from ..auth_backends.vk_backend import VKAuth

class AddUsersToList(TestCase):
    @patch.object(VKAuth.api.friends, 'get')
    def test_auth_vk(self, mock_get):
         ... etc ...

我做错了什么?如何在此类结构中访问此方法?

1 个答案:

答案 0 :(得分:2)

你试图模仿一个类本身,而不是它的实例。并且该类没有api属性,因为它是在__init__()中创建的。将您的代码更改为:

def test_auth_vk(self, mock_get):
    vk_auth = VKAuth(access_token, user)
    with mock.patch('vk_auth.api.friends') as friends_mock:
        friends_mock.get.return_value = None
        # Invoke the code that calls your api, passing the "vk_auth" variable as a backend.
        # ...
        friends_mock.mock.get.assert_called_with(your_arguments)

如果您不能只将auth后端传递给代码,请查看实例化的位置并模拟该位置。