2016-03-22 10 views
2

Ich habe eine benutzerdefinierte Throttling-Klassen basierend auf Django REST-Framework SimpleRateThrottle und ich möchte meine benutzerdefinierte Klasse mit Pytest testen. Da meine Standard-Testeinstellungen DummyCache verwenden, möchte ich nur für dieses spezielle Testmodul zu LocMemCache wechseln (SimpleRateThrottle verwendet das Cache-Backend, um die Anzahl zu messen). Gibt es eine Möglichkeit, das Cache-Backend nur für selektive Tests zu wechseln? Settings.CACHE in einem Gerät scheint nicht zu funktionieren. Ich habe auch versucht, den default_cache in der SimpleRateThrottle zu verspotten, aber ich konnte es nicht richtig machen.Verwenden Sie LocMemCache für selektive Django Pytest

naive_throttler.py

from rest_framework.throttling import SimpleRateThrottle 

class NaiveThrottler(SimpleRateThrottle): 
    ... 

rest_framework/throttling.py

from django.core.cache import cache as default_cache # Or how can I patch this? 

class SimpleRateThrottle(BaseThrottle): 
... 

Antwort

1

Django bietet override_settings and modify_settings Dekorateure dafür. Wenn Sie die CACHES Einstellungen nur für einen Test ändern möchten, können Sie dies tun:

from django.test import TestCase, override_settings 

class MyTestCase(TestCase): 

    @override_settings(CACHES = { 
          'default': { 
           'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
          } 
         }) 
    def test_chache(self): 
     # your test code 
+0

Dies ist eine gute Nachricht, aber es scheint nicht zu unterstützen pytest es nicht? – Andy

+0

Ich habe es nur mit pytest auf eine normale Funktion verwendet, sollte auch mit Klassenfunktionen arbeiten –

1

Während die Django-Funktionen zur Verfügung gestellt/Dekorateure arbeiten können, bietet pytest-django eine fixture for changing settings for a test. Um eine bessere pytest ‚s Paradigma der using fixtures for tests zu folgen, wäre es am besten die Einstellungen zu ändern, um einen Test spezifisch wie folgt:

import pytest 

def test_cache(settings): 
    settings.CACHES = { 
     'default': { 
      'BACKEND': 'django.core.cache.backends.dummy.DummyCache', 
     } 
    } 
    # test logic here 
+0

hast du meinen Tag gerettet! –