Python 模块变量的Django测试模拟实例
我正在尝试测试我的Django应用程序,它有一个代理API,在自己的模块中实例化 api.pyPython 模块变量的Django测试模拟实例,python,django,unit-testing,mocking,Python,Django,Unit Testing,Mocking,我正在尝试测试我的Django应用程序,它有一个代理API,在自己的模块中实例化 api.py class ProxyApi(object): def __init__(self, server_info): pass def validate_login(self, credentials): # call to real api here api = ProxyAPi() from mymodule.api import api class M
class ProxyApi(object):
def __init__(self, server_info):
pass
def validate_login(self, credentials):
# call to real api here
api = ProxyAPi()
from mymodule.api import api
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
if api.validate_login():
# do something with proxy api
from mymodule.api import api
class TaskView(LoginRequiredMixin, FormView):
def get(self, request):
if api.validate_login():
# do something with proxy api
class InputTasksViewTest(TestCase):
@mock.patch('mymodule.api.ProxyAPi')
def test_add(self, mock_api):
mock_api.validate_login.return_value = True
response = self.client.get(reverse('task'))
middleware.py
class ProxyApi(object):
def __init__(self, server_info):
pass
def validate_login(self, credentials):
# call to real api here
api = ProxyAPi()
from mymodule.api import api
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
if api.validate_login():
# do something with proxy api
from mymodule.api import api
class TaskView(LoginRequiredMixin, FormView):
def get(self, request):
if api.validate_login():
# do something with proxy api
class InputTasksViewTest(TestCase):
@mock.patch('mymodule.api.ProxyAPi')
def test_add(self, mock_api):
mock_api.validate_login.return_value = True
response = self.client.get(reverse('task'))
视图.py
class ProxyApi(object):
def __init__(self, server_info):
pass
def validate_login(self, credentials):
# call to real api here
api = ProxyAPi()
from mymodule.api import api
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
if api.validate_login():
# do something with proxy api
from mymodule.api import api
class TaskView(LoginRequiredMixin, FormView):
def get(self, request):
if api.validate_login():
# do something with proxy api
class InputTasksViewTest(TestCase):
@mock.patch('mymodule.api.ProxyAPi')
def test_add(self, mock_api):
mock_api.validate_login.return_value = True
response = self.client.get(reverse('task'))
测试.py
class ProxyApi(object):
def __init__(self, server_info):
pass
def validate_login(self, credentials):
# call to real api here
api = ProxyAPi()
from mymodule.api import api
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
if api.validate_login():
# do something with proxy api
from mymodule.api import api
class TaskView(LoginRequiredMixin, FormView):
def get(self, request):
if api.validate_login():
# do something with proxy api
class InputTasksViewTest(TestCase):
@mock.patch('mymodule.api.ProxyAPi')
def test_add(self, mock_api):
mock_api.validate_login.return_value = True
response = self.client.get(reverse('task'))
原始的validate\u登录名仍然被调用
我想知道如何在保留模拟功能的同时处理ProxyApi的实例化。您在api中有def validate\u登录(self,credentials):
在中间件中定义以下代码。那么您将如何从中间件API.validate\u login():
好的,我找到了自己的解决方案,问题是一旦Django启动,它就会读取一些文件(如模型、视图或中间件),这些文件会自动从导入中实例化api变量
我只需要推迟这个实例化,这样我就可以模拟ProxyApi对象了,下面是我所做的:
api = SimpleLazyObject(lambda: ProxApi())
很抱歉,我不明白您的答案,这个问题是关于模拟的,我的中间件和视图都很好,我只需要注意模拟我的ProxyApi对象