2014-11-27 2 views
0

У меня есть простой тест, который пытается проверить уникальность определенного поля документа. Тем не менее, настройка уникальности, похоже, не работает, не отбрасывая всю коллекцию в дополнение к удалению базы данных между тестами. Я не уверен, что я что-то неправильно понял или это что-то вроде ошибки. Любые советы будут высоко ценится. Благодаря!Уникальность 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) 

Итак, две вещи, которые я здесь не понимаю. Во-первых, в чем разница между удалением базы данных и удалением коллекций в дополнение к удалению базы данных. Я думал, что сбросить базу данных должно быть достаточно, чтобы сбросить состояние. Во-вторых, несмотря ни на что, уникальность ведет себя странно здесь, и, возможно, я сделал что-то неправильно?

Любые идеи? Большое спасибо!

ответ

1

Так что это ошибка, когда MongoEngine не обеспечивает индексы после того, как база данных была удалена.

Вопрос был указан в GitHub issue, и исправление было объединено в pull request.

Смежные вопросы