python - 如何为此中间件文件 django 编写正确的单元测试用例?

标签 python django unit-testing

我正在使用 django,现在可以为中间件文件编写单元测试用例, View 很容易,因为我可以使用客户端并检查响应对象。但这变得有点棘手。如何为这两个条件语句编写测试用例。

def process_request(self, request):
    connection.set_schema_to_public()
    hostname = self.hostname_from_request(request)

    if hostname == settings.MAIN_SITE_HOST_NAME:
        return None
    elif hostname == 'tenant.test.com':
        request.tenant = request.institute = Institute.objects.get(
            domain_url=hostname, schema_name='test')

    connection.set_tenant(request.tenant)
    return None

也附加了 host_name_from_request 方法,

def hostname_from_request(self, request):
    """ Extracts hostname from request. Used for custom requests filtering.
        By default removes the request's port and common prefixes.
    """
    domain_parts = request.get_host().split('.')
    if len(domain_parts) > 3:
        return remove_www(request.get_host().split(':')[0])
    else:
        return (request.get_host().split(':')[0])

在检查如何为中间件编写测试用例时,我发现了this site但我仍然不确定如何处理我的情况。

我试过这样的东西

def test_from_client(self):
    self.middleware = InstituteMiddleWare()
    self.request = Mock()
    self.request.path('/')
    self.assertIsNone(self.middleware.process_request(self.request)) 

它说模拟对象没有属性get_host

最佳答案

尝试使用 django.test 中的 RequestFactory 类。您可以通过在 kwargs 中传递 SERVER_NAME 来修改主机,否则它默认为 'testserver'

https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#the-request-factory

from django.test import RequestFactory
def test_from_client(self):
    self.middleware = InstituteMiddleWare()
    self.factory = RequestFactory(SERVER_NAME='tenant.test.com')

    request = self.factory.get("/")
    self.assertIsNone(self.middleware.process_request(request))

关于python - 如何为此中间件文件 django 编写正确的单元测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020838/

相关文章:

python - Python语法错误

python - 使用 scikit-learn 执行 LDA 降维时出错

Django - 如何通过 post_save 信号保存 m2m 数据?

mysql - 使用 sorl-thumbnail 和 Django Admin

unit-testing - 如何使用 Mockito 在 Flutter 中模拟静态方法?

Python:是在主线程中定义并从主线程或调用线程中的另一个运行中调用的函数

Python 多处理 - 如何将 kwargs 传递给函数?

django - 使用 Django Model 类继承为表创建审核日志

c# - 如何测试返回的数组至少包含一个具有特定属性值的值

c++ - 将 cout 和 stdout 都重定向到 C++ 中的字符串以进行单元测试