У меня есть простой тест, который пытается проверить уникальность определенного поля документа. Тем не менее, настройка уникальности, похоже, не работает, не отбрасывая всю коллекцию в дополнение к удалению базы данных между тестами. Я не уверен, что я что-то неправильно понял или это что-то вроде ошибки. Любые советы будут высоко ценится. Благодаря!Уникальность MongoEngine не работает в нескольких тестовых случаях
import unittest
from mongoengine import *
class User(Document):
email = EmailField(max_length=200, required=True, unique=True)
class TestBase(unittest.TestCase):
def setUp(self):
self.db = connect('test_database')
def tearDown(self):
# User.drop_collection() # Uncomment this line to get the expected results.
self.db.drop_database('test_database')
self.db.close()
def test_duplicate(self):
User(email='[email protected]').save()
User(email='[email protected]').save()
def test_duplicate_again(self):
User(email='[email protected]').save()
User(email='[email protected]').save()
def test_duplicatw_once_again(self):
User(email='[email protected]').save()
User(email='[email protected]').save()
if __name__ == '__main__':
unittest.main()
Ожидаемый результат заключается в том, что все три тестовых случая потерпят неудачу с ошибкой NotUniqueError. Однако только первый тестовый пример завершился неудачно, и остальные тесты прошли.
(venv)$ python -m unittest -v tests.users
test_duplicate (tests.users.TestBase) ... ERROR
test_duplicate_again (tests.users.TestBase) ... ok
test_duplicatw_once_again (tests.users.TestBase) ... ok
======================================================================
ERROR: test_duplicate (tests.users.TestBase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "tests/users.py", line 18, in test_duplicate
User(email='[email protected]').save()
File "/Users/starsirius/Code/santa/venv/src/mongoengine/mongoengine/document.py", line 312, in save
raise NotUniqueError(message % unicode(err))
NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error index: test_database.user.$email_1 dup key: { : "[email protected]" })
----------------------------------------------------------------------
Ran 3 tests in 1.138s
FAILED (errors=1)
Если я раскомментировать строку User.drop_collection() (следовательно, падение сбора между испытаниями), то результат будет правильно и все три теста не удалось.
(venv)$ python -m unittest -v tests.users
test_duplicate (tests.users.TestBase) ... ERROR
test_duplicate_again (tests.users.TestBase) ... ERROR
test_duplicatw_once_again (tests.users.TestBase) ... ERROR
======================================================================
ERROR: test_duplicate (tests.users.TestBase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "tests/users.py", line 18, in test_duplicate
User(email='[email protected]').save()
File "/Users/starsirius/Code/santa/venv/src/mongoengine/mongoengine/document.py", line 312, in save
raise NotUniqueError(message % unicode(err))
NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error index: test_database.user.$email_1 dup key: { : "[email protected]" })
======================================================================
ERROR: test_duplicate_again (tests.users.TestBase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "tests/users.py", line 22, in test_duplicate_again
User(email='[email protected]').save()
File "/Users/starsirius/Code/santa/venv/src/mongoengine/mongoengine/document.py", line 312, in save
raise NotUniqueError(message % unicode(err))
NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error index: test_database.user.$email_1 dup key: { : "[email protected]" })
======================================================================
ERROR: test_duplicatw_once_again (tests.users.TestBase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "tests/users.py", line 26, in test_duplicatw_once_again
User(email='[email protected]').save()
File "/Users/starsirius/Code/santa/venv/src/mongoengine/mongoengine/document.py", line 312, in save
raise NotUniqueError(message % unicode(err))
NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error index: test_database.user.$email_1 dup key: { : "[email protected]" })
----------------------------------------------------------------------
Ran 3 tests in 1.200s
FAILED (errors=3)
Итак, две вещи, которые я здесь не понимаю. Во-первых, в чем разница между удалением базы данных и удалением коллекций в дополнение к удалению базы данных. Я думал, что сбросить базу данных должно быть достаточно, чтобы сбросить состояние. Во-вторых, несмотря ни на что, уникальность ведет себя странно здесь, и, возможно, я сделал что-то неправильно?
Любые идеи? Большое спасибо!