我正在尝试测试我的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()
middlewares.py
from mymodule.api import api
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
if api.validate_login():
# do something with proxy api
views.py
from mymodule.api import api
class TaskView(LoginRequiredMixin, FormView):
def get(self, request):
if api.validate_login():
# do something with proxy api
tests.py
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_login
。
我想知道如何处理ProxyApi的实例化,同时仍保留模拟容量。
答案 0 :(得分:0)
好的我找到了自己的解决方案,问题是一旦Django启动,它会读取一些自动从导入实例化api变量的文件(如模型或视图或中间件)。
我只需要推迟这个实例化,这样我就可以模拟ProxyApi对象,这就是我所做的:
api = SimpleLazyObject(lambda: ProxApi())
答案 1 :(得分:-3)
你在api中有def validate_login(self, credentials):
在中间件中,您定义下面的代码。那么如何从中间件api.validate_login(<You should send credentials to api as parameter>):
from mymodule.api import api
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
if api.validate_login():
pass