2017-06-15 70 views
0

我试图测试我的Django应用程序,它具有在其自己的模块中实例化的代理API。Django模块变量的测试模拟实例

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

好吧,我发现我自己的解决方案,问题是,一旦Django的开始,就看了一些文件(如模型或观点或中间件),可自动实例化API变量从进口。

我只是需要推迟这个实例,所以我可以嘲笑ProxyApi对象,这里就是我所做的:

api = SimpleLazyObject(lambda: ProxApi()) 
-3

你有def validate_login(self, credentials):在api 和你在中间代码定义下面的代码。所以,你怎么会派creadentials到API从中间件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 
+0

对不起,我不明白你的答案,这个问题是关于嘲讽,我的中间件和我的看法很好,我只需要嘲笑我的ProxyApi对象 – SebCorbin