如何在 Django 中模拟外部 api?
How to mock an external api in django?
我正在尝试模拟 VKAuth 中的 "self.api.friends.get" 方法 class:
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()
来自测试模块test_views.py:
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 ...
我在测试期间遇到错误:
AttributeError: <class 'accounts.auth_backends.vk_backend.VKAuth' doens't have the attribute 'api'
我做错了什么?如何在此 class 结构中访问此方法?
您正在尝试模拟 class 本身,而不是它的实例。 class 没有 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)
如果您不能只将身份验证后端传递给您的代码,请查找它实例化的位置并模拟该位置。
我正在尝试模拟 VKAuth 中的 "self.api.friends.get" 方法 class:
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()
来自测试模块test_views.py:
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 ...
我在测试期间遇到错误:
AttributeError: <class 'accounts.auth_backends.vk_backend.VKAuth' doens't have the attribute 'api'
我做错了什么?如何在此 class 结构中访问此方法?
您正在尝试模拟 class 本身,而不是它的实例。 class 没有 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)
如果您不能只将身份验证后端传递给您的代码,请查找它实例化的位置并模拟该位置。