python - pruebas - testcase client django
Las pruebas del tutorial de django fallan: no hay un módulo llamado polls.tests (4)
De todos modos corriendo
$ python manage.py test polls.tests
Funciona, es suficiente para mí en este momento:
Creating test database for alias ''default''...
F
======================================================================
FAIL: test_was_published_recently_with_future_poll (polls.tests.QuestionMethodTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/sergio/.virtualenvs/django4/mydjango/polls/tests.py", line 17, in test_was_published_recently_with_future_poll
self.assertEqual(future_question.was_published_recently(), False)
AssertionError: True != False
Estoy jugando con el tutorial de django 1.6 pero no puedo ejecutar pruebas. Mi proyecto (nombre mydjango) y la estructura de la aplicación (nombre es encuestas) se muestran a continuación en un virtualenv. (Los archivos .nja son creados por ninja-ide, el ide que estoy usando)
.
├── __init__.py
├── manage.py
├── mydjango
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── mydjango.nja
│ ├── settings.py
│ ├── settings.pyc
│ ├── templates
│ │ └── admin
│ │ └── base_site.html
│ ├── urls.py
│ ├── urls.pyc
│ ├── wsgi.py
│ └── wsgi.pyc
├── polls
│ ├── admin.py
│ ├── admin.pyc
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── models.py
│ ├── models.pyc
│ ├── templates
│ │ ├── __init__.py
│ │ └── polls
│ │ ├── detail.html
│ │ ├── index.html
│ │ ├── __init__.py
│ │ └── results.html
│ ├── tests.py
│ ├── tests.pyc
│ ├── urls.py
│ ├── urls.pyc
│ ├── views.py
│ └── views.pyc
└── polls.nja
Seguí el tutorial para entender cómo funciona django pero estoy atascado en la parte de prueba. Como sugerencia del tutorial, creé un archivo llamado tests.py en la carpeta de la aplicación, el archivo bastante sencillo es:
# -*- coding: utf-8 -*-
from django.test import TestCase
import datetime
from django.utils import timezone
from polls.models import Question
# Create your tests here.l
class QuestionMethodTests(TestCase):
def test_was_published_recently_with_future_poll(self):
"""
was_published_recently dovrebbe ritornare falso se si mette una data nel futuro
"""
future_question = Question(pub_date=timezone.now() + datetime.timedelta(hours=50))
self.assertEqual(future_question.was_published_recently(), False)
Entonces instalé unittest2 en el virtualenv con
$pip install unittest2
y correr
$python manage.py test polls
Creating test database for alias ''default''...
E
======================================================================
ERROR: mydjango.polls.tests (unittest2.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: mydjango.polls.tests
Traceback (most recent call last):
File "/home/sergio/.virtualenvs/django4/local/lib/python2.7/site-packages/unittest2/loader.py", line 260, in _find_tests
module = self._get_module_from_name(name)
File "/home/sergio/.virtualenvs/django4/local/lib/python2.7/site-packages/unittest2/loader.py", line 238, in _get_module_from_name
__import__(name)
ImportError: No module named polls.tests
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Destroying test database for alias ''default''...
No hay forma de que la prueba funcione, también si no pasa el nombre de la aplicación, devuelve el mismo error:
$ python manage.py test
Creating test database for alias ''default''...
E
======================================================================
ERROR: mydjango.polls.tests (unittest2.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: mydjango.polls.tests
Traceback (most recent call last):
File "/home/sergio/.virtualenvs/django4/local/lib/python2.7/site-packages/unittest2/loader.py", line 260, in _find_tests
module = self._get_module_from_name(name)
File "/home/sergio/.virtualenvs/django4/local/lib/python2.7/site-packages/unittest2/loader.py", line 238, in _get_module_from_name
__import__(name)
ImportError: No module named polls.tests
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Destroying test database for alias ''default''...
Mis INSTALLED_APPS son:
INSTALLED_APPS = (
''south'',
''django.contrib.admin'',
''django.contrib.auth'',
''django.contrib.contenttypes'',
''django.contrib.sessions'',
''django.contrib.messages'',
''django.contrib.staticfiles'',
''polls'',
)
¿Qué estoy haciendo mal?
La primera respuesta no funcionó para mí. Im usando win8, puede ser esta es una razón. en la terminal intente cambiar dir a ./polls y la ejecución
python ../manage.py test polls
Para cualquier otra persona que tenga el mismo problema, otra razón para que esto suceda es si tiene el mismo nombre para la carpeta raíz y la carpeta del proyecto.
Por ejemplo:
mydjango
├── __init__.py
├── manage.py
├── mydjango
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
├── polls
│ ├── admin.py
│ ├── __init__.py
│ ├── models.py
| ├── tests.py
│ ├── templates
ejecutando ./manage.py test
arroja errores No hay módulo llamado polls.tests
para solucionarlo, simplemente cambie el nombre de la carpeta raíz a otra cosa como:
mydjango_project
├── __init__.py
├── manage.py
├── mydjango
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
├── polls
│ ├── admin.py
│ ├── __init__.py
│ ├── models.py
| ├── tests.py
│ ├── templates
Tuve exactamente el mismo problema con mi proyecto Django:
$ python manage test polls.tests
trabajó bien mientras que lo siguiente falló con un error de importación
$ python manage test polls
$ python manage test
(...)
ImportError: Failed to import test module: mydjango.polls.tests
Traceback (most recent call last):
(...)
ImportError: No module named polls.tests
Verifique cuidadosamente el mensaje de error: el corredor de prueba de Django intenta importar las pruebas desde mydjango.polls.tests donde mydjango es el nombre del directorio raíz (el contenedor para su proyecto).
__init__.py
este problema eliminando el archivo __init__.py
en el directorio mydjango (al mismo nivel que el archivo manage.py). Este directorio no se supone que sea un módulo de Python y parece que se mete con el corredor de pruebas de Django, si es el caso.
Así que solo eliminar el archivo _ init _.py debería solucionar nuestro problema :
$ rm mydjango/__init__.py