2017-06-15 75 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