2017-01-11 2 views
0

In meiner App habe ich Zeile if request.get_host() == Site.objects.get_current().domain. Das Problem ist in meinen Tests dieser Zustand ist nie True. request.get_host() gibt testserver zurück und Site.objects.get_current gibt example.com zurück. Ich weiß, dass ich SERVER_NAME zu request hinzufügen kann, aber ich möchte global nicht in jeder einzelnen Anfrage ändern.So überschreiben Sie Site.get_current()/request.get_host() in Tests

Antwort

0

Sie können request.get_host() Verhalten durch Übergeben HTTP_HOST zu client.get() Methode steuern. Sie können SERVER_NAME wie erwähnt verwenden, aber HTTP_HOST wird bevorzugt, da es von get_host() verwendet wird, und SERVER_NAME wird in Bezug auf die Variable SERVER_PORT verwendet, sodass Sie "SERVER_NAME: SERVER_PORT" in einem nicht standardmäßigen Port abrufen können Fälle.

So könnte Ihr Test wie folgt aussehen:

from django.test import TestCase 

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

Wenn Sie es ganz Testfall-Klasse tun möchten, können Sie client_class wie dies außer Kraft setzen können:

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('/') 

Oder Sie können ein schreiben Mischen Sie für TestCase, die ähnlich wie in meinem vorherigen Beispiel aussehen wird.

Schließlich können Sie django.test.TestCase.client_class überschreiben. Das wird global funktionieren, aber es sieht ein bisschen hacky aus, also würde ich dir das nicht empfehlen.

Verwandte Themen