如何在测试

时间:2017-01-11 17:56:47

标签: django django-unittest

在我的应用中,我有一行if request.get_host() == Site.objects.get_current().domain。问题出在我的测试中,这个条件永远不会Truerequest.get_host()返回testserverSite.objects.get_current返回example.com。我知道我可以将SERVER_NAME添加到request,但我希望全局更改而不是每次请求。

1 个答案:

答案 0 :(得分:0)

您可以通过将 HTTP_HOST 传递给request.get_host()方法来控制client.get()行为。您可以使用SERVER_NAME,如上所述,但首选HTTP_HOST,因为get_host()按原样使用它,而SERVER_NAME用于SERVER_PORT变量,因此您可以获得" SERVER_NAME:SERVER_PORT"在一些非默认端口的情况下。

所以你的测试看起来像这样:

from django.test import TestCase

class FooTests(TestCase):
    def test_bar(self):
        self.client.get('/', HTTP_HOST='example.com')

如果您想在整个测试用例类中执行此操作,可以像这样覆盖client_class

from django.test import TestCase
from django.test.client import Client


class MyClient(Client):
    HTTP_HOST = 'example.com'

    def get(self, *args, **kwargs):
        kwargs.setdefault('HTTP_HOST', self.HTTP_HOST)
        return super(MyClient, self).get(*args, **kwargs)


class MyTestCase(TestCase):
    client_class = MyClient


class FooTests(MyTestCase):
    def test_foo(self):
        self.client.get('/')

或者你可以为TestCase写一个Mixin,它看起来与我之前的例子类似。

最后,您可以覆盖django.test.TestCase.client_class。这将在全球范围内工作,但它看起来有点hacky,所以我不建议你这样做。