Freezetime不适用于FastAPI测试客户端



Freezetime似乎不适用于FastAPI TestClient。我构建了这个简单的例子,测试失败了。在这种情况下,Freezetime不会覆盖日期时间:/

import datetime
from fastapi import FastAPI
from fastapi.testclient import TestClient
from pydantic import BaseModel
from freezegun import freeze_time
app = FastAPI()

class Message(BaseModel):
message: str = "Hello World"
timestamp: datetime.datetime = datetime.datetime.utcnow()

@app.get("/", response_model=Message)
def main() -> Message:
return Message()

client = TestClient(app)
@freeze_time('2022-09-18T13:36:41.624237')
def test_read_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {
'message': 'Hello World',
'timestamp': '2022-09-18T13:36:41.624237'
}

当我运行pytest时,我得到了这个消息

@freeze_time('2022-09-18T13:36:41.624237')
def test_read_main():
response = client.get("/")
assert response.status_code == 200
>       assert response.json() == {
'message': 'Hello World',
'timestamp': '2022-09-18T13:36:41.624237'
}
E       AssertionError: assert {'message': '...44:25.021208'} == {'message': '...36:41.624237'}
E         Omitting 1 identical items, use -vv to show
E         Differing items:
E         {'timestamp': '2022-09-18T13:44:25.021208'} != {'timestamp': '2022-09-18T13:36:41.624237'}
E         Use -v to get more diff

如果使用FastAPI TestClient可以进行此类测试,有什么想法吗?

如前所述,定义另一个函数并将该函数的引用分配给模型。这样,冷冻枪应该能够覆盖日期时间。

...
from pydantic import Field
def current_time():
return datetime.datetime.utcnow()
class Message(BaseModel):
message: str = "Hello World"
timestamp: datetime.datetime = Field(default_factory=current_time)
...

最新更新