mongodb 中的测试数据 - 时间变化
Testing Data in mongodb - time varies
我目前正在测试我的数据库可访问性,我 运行 遇到了一个严重的问题。我正在模拟数据库并插入一个具有注册日期的用户对象。该日期首先被写入一个变量,然后传递给应该产生完全相同值的数据。好吧,它没有...
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
为什么那里的时间不同?
如果您在 data.py
中默认了注册日期,那您为什么还要在创建用户字典时设置它?也许这就是造成它的原因。另外你为什么不直接创建一个 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
的 timestamp?
编辑2:
根据 API 参考,您需要使用 Complex DateTimeField 常规 DatetimeField
不能很好地处理微秒。
来自 DatetimeField
参考:
Note: Microseconds are rounded to the nearest millisecond.
Pre UTC microsecond support is effectively broken. Use ComplexDateTimeField if you need accurate microsecond support.
我目前正在测试我的数据库可访问性,我 运行 遇到了一个严重的问题。我正在模拟数据库并插入一个具有注册日期的用户对象。该日期首先被写入一个变量,然后传递给应该产生完全相同值的数据。好吧,它没有...
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
为什么那里的时间不同?
如果您在 data.py
中默认了注册日期,那您为什么还要在创建用户字典时设置它?也许这就是造成它的原因。另外你为什么不直接创建一个 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
的 timestamp?
编辑2:
根据 API 参考,您需要使用 Complex DateTimeField 常规 DatetimeField
不能很好地处理微秒。
来自 DatetimeField
参考:
Note: Microseconds are rounded to the nearest millisecond.
Pre UTC microsecond support is effectively broken. Use ComplexDateTimeField if you need accurate microsecond support.