【发布时间】:2019-06-13 00:26:33
【问题描述】:
在我的模型中使用 default 和 onupdate 字段时,我在模拟 SQLAlchemy 对象时遇到了一些问题:
def get_uuid():
return str(uuid.uuid4())
def get_now():
return db.func.now()
class BaseModel(db.Model):
__abstract__ = True
id = db.Column(UUIDType(binary=False), primary_key=True, nullable=False, default=get_uuid)
created_at = db.Column(db.DateTime(timezone=True), default=get_now(), nullable=False, index=True)
get_now() 和 get_uuid() 的行为即使在我尝试在测试中模拟它们时也不会改变:
def test_create_source(client, mocker):
mock = mocker.MagicMock(return_value='123e4567-e89b-12d3-a456-426655440000')
mocker.patch('myproject.models.get_uuid', mock)
mock = mocker.MagicMock(return_value=datetime.datetime(2019, 1, 1))
mocker.patch('myproject.models.get_now', mock)
resp = client.post('/sources', json={'name': 'My source'})
assert resp.json == {
'name': 'My source',
'id': '123e4567-e89b-12d3-a456-426655440000',
'createdAt': 'Tue, 01 Jan 2019 00:00:00 GMT',
'updatedAt': 'Tue, 01 Jan 2019 00:00:00 GMT'
}
### Results :
> assert resp.json == {
'name': 'My source',
'id': '123e4567-e89b-12d3-a456-426655440000',
'createdAt': 'Tue, 01 Jan 2019 00:00:00 GMT',
'updatedAt': 'Tue, 01 Jan 2019 00:00:00 GMT'
}
E AssertionError: assert {'createdAt':...17:38:38 GMT'} == {'createdAt': ...00:00:00 GMT'}
E Omitting 1 identical items, use -vv to show
E Differing items:
E {'id': '8eb074c0-41e9-436c-8f71-b4c6842f4809'} != {'id': '123e4567-e89b-12d3-a456-426655440000'}
E {'createdAt': 'Fri, 18 Jan 2019 17:38:38 GMT'} != {'createdAt': 'Tue, 01 Jan 2019 00:00:00 GMT'}
E {'updatedAt': 'Fri, 18 Jan 2019 17:38:38 GMT'} != {'updatedAt': 'Tue, 01 Jan 2019 00:00:00 GMT'}
E Use -v to get the full diff
tests/test_sources.py:17: AssertionError
我认为这是因为我的模型及其属性在进行测试之前已经被导入和评估,所以模拟在这里没有用。 post 的“模拟类助手”部分对此进行了解释,但我仍然无法解决我的问题 :(
重现该问题的完整可运行代码可在此处获得:https://github.com/ncrocfer/flaskmock
请问你有什么想法吗?
【问题讨论】:
标签: python testing flask sqlalchemy pytest