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

时间:2017-06-15 16:11:23

标签: 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()

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的实例化,同时仍保留模拟容量。

2 个答案:

答案 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>):

向API发送creadentials
from mymodule.api import api

class MyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if api.validate_login():
            pass