【问题标题】:Django Test mock instance of module variableDjango 测试模块变量的模拟实例
【发布时间】:2017-06-15 16:11:22
【问题描述】:

我正在尝试测试我的 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 的实例化,同时仍保留模拟能力。

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

    好的,我找到了自己的解决方案,问题是一旦 Django 启动,它会读取一些文件(如模型或视图或中间件),这些文件会自动从导入中实例化 api 变量。

    我只需要推迟这个实例化,这样我就可以模拟 ProxyApi 对象,这就是我所做的:

    api = SimpleLazyObject(lambda: ProxApi())
    

    【讨论】:

      【解决方案2】:

      你在 api 中有def validate_login(self, credentials): 并在中间件中定义以下代码。那么您将如何从中间件api.validate_login(<You should send credentials to api as parameter>): 向 API 发送凭据

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

      【讨论】:

      • 对不起,我不明白你的回答,这个问题是关于模拟的,我的中间件和我的观点都很好,我只需要注意模拟我的 ProxyApi 对象
      猜你喜欢
      • 1970-01-01
      • 2015-11-11
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      相关资源
      最近更新 更多