2010-03-18 17 views
29

estoy tratando de empezar a escribir pruebas unitarias para Django y tengo algunas preguntas acerca de los accesorios:Cargando accesorios en la unidad de pruebas de Django

hice un accesorio de toda mi db proyecto (no determinada aplicación) y yo quiero cargarlo para cada prueba, porque parece que cargar solo el accesorio para cierta aplicación no será suficiente.

Me gustaría tener el dispositivo almacenado en /proj_folder/fixtures/proj_fixture.json.

He configurado el FIXTURE_DIRS = ('/fixtures/',) en mi settings.py. Luego, en mi caso de prueba estoy tratando

fixtures = ['proj_fixture.json'] 

pero mis accesorios no se cargan. ¿Cómo se puede resolver esto? ¿Cómo agregar el lugar para buscar accesorios? En general, ¿está bien cargar el dispositivo para el test_db completo para cada prueba en cada aplicación (si es bastante pequeño)? Gracias!

+0

Tal vez usted puede utilizar una ruta relativa? Me gusta '[" ../../ fixtures/proj_fixture.json "]'. –

+0

Lo intenté, pero no funcionó .. Django busca accesorios solo en la carpetaproj_folder/app_folder/fixtures –

Respuesta

27

¿Realmente tiene una carpeta /fixtures/ en su disco duro?

Probablemente la intención de utilizar:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',) 
+1

Creo que de forma predeterminada django busca aplicaciones/accesorios porque 'manage.py loaddata fixture.json' funcionará sin' Se está configurando la variable FIXTURE_DIRS. –

29

buena práctica es mediante la variable PROJECT_ROOT en su settings.py:

import os.path 
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__)) 
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),) 
72

he especificado ruta relativa a la raíz del proyecto en el TestCase como tal :

from django.test import TestCase 

class MyTestCase(TestCase): 
    fixtures = ['/myapp/fixtures/dump.json',] 
    ... 

y funcionó sin utilizar FIXTURE_DIRS

+0

No sé por qué esta respuesta no recibió más amor. Es la respuesta correcta ... No deberías tener que preocuparte por una ruta de acceso absoluta. – Cerin

+6

Mi configuración puede ser diferente, pero no funcionó hasta que eliminé el primer caracter '/'. – Mikhail

+1

Si está realizando pruebas locales en una aplicación, parece estar funcionando para decir 'dump.json', porque Django busca automáticamente la carpeta de dispositivos. –

2

Hice esto y no tuve que dar una referencia de ruta, el nombre del archivo de instalación fue suficiente para mí.

class SomeTest(TestCase): 

    fixtures = ('myfixture.json',) 
+1

También me gustaría señalar que la extensión '.json' también es opcional. – Rollo

+2

Tenga en cuenta que si no está utilizando prácticas recomendadas y pega el mismo dispositivo con pequeños retoques con el mismo nombre en diferentes aplicaciones, django podría cargar el dispositivo incorrecto si no muestra una ruta explícita al dispositivo correcto en su archivo de prueba. No suponga que solo se verá en el directorio de dispositivos de su aplicación actual. –

1

tiene dos opciones, dependiendo de si usted tiene un accesorio, o si tiene un conjunto de código Python para rellenar los datos.

Para los artefactos, utilice cls.fixtures, como se muestra en la an answer a esta pregunta,

class MyTestCase(django.test.TestCase): 
    fixtures = ['/myapp/fixtures/dump.json',] 

Para Python, utilice cls.setUpTestData:

class MyTestCase(django.test.TestCase): 
    @classmethod 
    def setUpTestData(cls): 
     cls.create_fixture() # create_fixture is a custom function 

setUpTestData es llamado por el TestCase.setUpClass.

Puede usar ambos, en cuyo caso los dispositivos se cargan primero porque se llama al setUpTestData después de cargar los dispositivos.

+0

¿Qué tipo de código tendrá 'create_fuxture'? Estoy tratando de usar accesorios. Aunque lo especifico correctamente, mi prueba llama a db. ¿Por qué? ¿Qué me perdí? ¿Es la lógica 'create_fixture'? – Hussain

6

En lugar de crear fixures carpeta y colocar accesorios en ellos (en cada aplicación), una mejor y más ordenada forma de manejar esto sería poner todos los dispositivos en una carpeta en el nivel del proyecto y cargarlos.

from django.core.management import call_command 

class TestMachin(TestCase): 

    def setUp(self): 
     # Load fixtures 
     call_command('loaddata', 'fixtures/myfixture', verbosity=0) 

Invocando call_command es equivalente a ejecutar:

manage.py loaddata /path/to/fixtures 
1

Digamos que su nombre del proyecto es hello_django, tiene una aplicación llamada api. A continuación se presenta pasos para crear accesorios en api:

  1. Paso opcional: crear archivo de datos de base de datos: python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. Crear directorio de prueba: api/tests
  3. Crear archivo vacío __init__.py en api/tests
  4. Crear archivo de prueba: test_fixtures .py

Test Fixtures

  1. Ejecutar la prueba (se puede cargar sus accesorios de la base de datos): python manage.py test api.tests
Cuestiones relacionadas