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)
...