Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模块变量的Django测试模拟实例_Python_Django_Unit Testing_Mocking - Fatal编程技术网

Python 模块变量的Django测试模拟实例

Python 模块变量的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

我正在尝试测试我的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 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对象