Данные тестирования в mongodb - время меняется - PullRequest
0 голосов
/ 04 октября 2018

В настоящее время я проверяю свою доступность базы данных и столкнулся с серьезной проблемой.Я издеваюсь над базой данных и вставляю объект пользователя, у которого есть дата регистрации.Эта дата сначала записывается в переменную, а затем передается в данные, что должно привести к точно такому же значению.Ну, это не так ...

data.py

class User(Document):
    email = EmailField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(required=True, max_length=50)
    registration_date = DateTimeField(default=datetime.utcnow())
    last_login = DateTimeField()

test_storage.py

import datetime
import pytest

from mongoengine.connection import (
    connect,
    get_connection,
)

from mongodb.data import User
from storage.users import get_users


FMT = "%Y-%m-%d %H:%M"


@pytest.fixture(scope='module')
def mock_db():
    connect('mongoenginetest', host='mongomock://localhost')

@pytest.fixture(scope='module')
def mock_user(mock_db):
    user = {
        'email': 'wijgowol@kogun.gi',
        'registration_date': datetime.datetime.utcnow(),
        'last_name': 'Bowen',
        'first_name': 'Charlie',
    }
    db_user = User (**user)
    db_user.save()

    return user, db_user



def test_storage_get_user(mock_user):
    user, db_user = mock_user

    users = get_users()
    assert len(users) == 1
    assert type(users[0]) == User

    u = users[0]
    assert u == db_user
    assert u.email == user['email']
    assert u.registration_date == user['registration_date']
    assert u.last_name == user['last_name']
    assert u.first_name == user['first_name']

Когда я запускаю тест, я получаю следующий результат:

_____________________________________________________________________________________________________________________ test_storage_get_user _____________________________________________________________________________________________________________________

mock_user = ({'email': 'wijgowol@kogun.gi', 'first_name': 'Charlie', 'last_name': 'Bowen', 'registration_date': datetime.datetime(2018, 10, 4, 10, 49, 56, 814025)}, <User: User object>)

def test_storage_get_user(mock_user):
    user, db_user = mock_user

    users = get_users()
    assert len(users) == 1
    assert type(users[0]) == User

    u = users[0]
    assert u == db_user
    assert u.email == user['email']
>       assert u.registration_date == user['registration_date']
E       assert datetime.datetime(2018, 10, 4, 10, 49, 56, 814000) == datetime.datetime(2018, 10, 4, 10, 49, 56, 814025)
E        +  where datetime.datetime(2018, 10, 4, 10, 49, 56, 814000) == <User: User object>.registration_date

app/test/test_impl.py:53: AssertionError

Почему время там меняется?

1 Ответ

0 голосов
/ 04 октября 2018

Если вы по умолчанию устанавливаете дату регистрации в data.py, то почему вы даже устанавливаете ее при создании пользовательского dict?Может быть, это то, что вызывает это.Кроме того, почему бы вам просто не создать User вместо этого?

У вас есть это:

user = {
    'email': 'wijgowol@kogun.gi',
    'registration_date': datetime.datetime.utcnow(),
    'last_name': 'Bowen',
    'first_name': 'Charlie',
}
db_user = User (**user)
db_user.save()

Я бы использовал это вместо:

db_user = User(
    email = 'wijgowol@kogun.gi',
    last_name = 'Bowen',
    first_name = 'Charlie'
).save()

Редактировать: Согласно моему комментарию.

Также еслидата регистрации всегда устанавливается при создании пользователя, тогда почему бы просто не использовать _id отметку времени ?

Edit2: Согласно справочнику API вынеобходимо использовать Complex DateTimeField обычное DatetimeField плохо обрабатывает микросекунды.

Из ссылки DatetimeField :

Примечание. Микросекунды округляются до ближайшей миллисекунды.

Предварительно поддержка микросекунд до UTC фактически нарушена.Используйте ComplexDateTimeField, если вам нужна точная поддержка микросекунд.

...