fastAPI 一些测试 return 404 |测试
fastAPI some tests return 404 | pytest
我目前正在尝试为我的 fastAPI 程序编写一些单元测试。
但问题是,有些测试 return 出现 {"detail": "Not found"}
错误,而其他测试则有效。我在 VSCode.
内的本地机器的终端中通过 pytest
调用测试
抛出此错误的测试之一:
def test_test(client):
res = client.get("/1")
assert res.status_code == 200
我已经对通过 pytest fixture 创建的用户 ID 进行了硬编码,但即使我将 ID 号设为动态(它始终为 1,因为我只创建了 1 个用户并在每次测试后重置了数据库会话)它有同样的问题。
我要测试的路线:
@router.get("/{id}", response_model=schemas.UserResponse)
def get_user(id: int, db: Session = Depends(get_db)):
user = db.query(models.User).filter(models.User.id == id).first()
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"User with id: {id} does not exist.",
)
return user
以下是 运行 在无法正常工作的测试之前的测试
def test_create_user(client):
res = client.post("/users/", json={"email": "test@test.com", "password": "password123"})
new_user = schemas.UserResponse(**res.json())
assert new_user.email == "test@test.com"
assert res.status_code == 201
def test_login_user(client, test_user):
res = client.post("/login", data={"username": test_user["email"], "password": test_user["password"]})
login_res = schemas.Token(**res.json())
payload = jwt.decode(login_res.access_token, settings.JWT_SECRET_KEY, algorithms=[settings.ALGORITHM])
id_ = payload.get("user_id")
assert id_ == test_user["id"]
assert login_res.token_type == "bearer"
assert res.status_code == 200
我试过在路线的尽头使用/
,还是不行。我试图直接从目录调用测试并通过断点进行调试。但我不明白为什么它找不到这条路线(再加上 2 条,但我猜问题是一样的)。
如果您需要更多信息,请告诉我,我很乐意提供。
以下是我最满意的一些设置:
def override_get_db():
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
@pytest.fixture()
def session(scope="session"):
Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
@pytest.fixture()
def client(session):
def override_get_db():
try:
yield session
finally:
session.close()
app.dependency_overrides[get_db] = override_get_db
yield TestClient(app)
@pytest.fixture
def test_user(client):
user_data = {"email": "testcreate@example.com", "password": "password123"}
res = client.post("/users/", json=user_data)
assert res.status_code == 201
new_user = res.json()
new_user["password"] = user_data["password"]
return new_user
由于您没有在用户示例中显示安装路由器的位置,因此很难说,但我最初的猜测是您可能将其安装在 /users
下,并且缺少 [=13] =] 部分在 1
前面(因为用户 ID 直接在 / 下似乎有点奇怪)。
您的测试客户端仅请求 /1,而不是我期望的 /users/1 布局。
def test_user_can_be_retrieved(client):
res = client.get("/users/1")
assert res.status_code == 200
您可能还想在检索用户之前使用您的用户装置创建用户。我也会跳过从 API:
返回密码
@pytest.fixture
def created_user(client):
user_data = {"email": "testcreate@example.com", "password": "password123"}
res = client.post("/users", json=user_data)
assert res.status_code == 201
return res.json()
def test_user_can_be_retrieved(client, created_user):
res = client.get("/users/1")
assert res.status_code == 200
user = res.json()
assert user.username == created_user.username
# etc.
我目前正在尝试为我的 fastAPI 程序编写一些单元测试。
但问题是,有些测试 return 出现 {"detail": "Not found"}
错误,而其他测试则有效。我在 VSCode.
pytest
调用测试
抛出此错误的测试之一:
def test_test(client):
res = client.get("/1")
assert res.status_code == 200
我已经对通过 pytest fixture 创建的用户 ID 进行了硬编码,但即使我将 ID 号设为动态(它始终为 1,因为我只创建了 1 个用户并在每次测试后重置了数据库会话)它有同样的问题。
我要测试的路线:
@router.get("/{id}", response_model=schemas.UserResponse)
def get_user(id: int, db: Session = Depends(get_db)):
user = db.query(models.User).filter(models.User.id == id).first()
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"User with id: {id} does not exist.",
)
return user
以下是 运行 在无法正常工作的测试之前的测试
def test_create_user(client):
res = client.post("/users/", json={"email": "test@test.com", "password": "password123"})
new_user = schemas.UserResponse(**res.json())
assert new_user.email == "test@test.com"
assert res.status_code == 201
def test_login_user(client, test_user):
res = client.post("/login", data={"username": test_user["email"], "password": test_user["password"]})
login_res = schemas.Token(**res.json())
payload = jwt.decode(login_res.access_token, settings.JWT_SECRET_KEY, algorithms=[settings.ALGORITHM])
id_ = payload.get("user_id")
assert id_ == test_user["id"]
assert login_res.token_type == "bearer"
assert res.status_code == 200
我试过在路线的尽头使用/
,还是不行。我试图直接从目录调用测试并通过断点进行调试。但我不明白为什么它找不到这条路线(再加上 2 条,但我猜问题是一样的)。
如果您需要更多信息,请告诉我,我很乐意提供。
以下是我最满意的一些设置:
def override_get_db():
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
@pytest.fixture()
def session(scope="session"):
Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
@pytest.fixture()
def client(session):
def override_get_db():
try:
yield session
finally:
session.close()
app.dependency_overrides[get_db] = override_get_db
yield TestClient(app)
@pytest.fixture
def test_user(client):
user_data = {"email": "testcreate@example.com", "password": "password123"}
res = client.post("/users/", json=user_data)
assert res.status_code == 201
new_user = res.json()
new_user["password"] = user_data["password"]
return new_user
由于您没有在用户示例中显示安装路由器的位置,因此很难说,但我最初的猜测是您可能将其安装在 /users
下,并且缺少 [=13] =] 部分在 1
前面(因为用户 ID 直接在 / 下似乎有点奇怪)。
您的测试客户端仅请求 /1,而不是我期望的 /users/1 布局。
def test_user_can_be_retrieved(client):
res = client.get("/users/1")
assert res.status_code == 200
您可能还想在检索用户之前使用您的用户装置创建用户。我也会跳过从 API:
返回密码@pytest.fixture
def created_user(client):
user_data = {"email": "testcreate@example.com", "password": "password123"}
res = client.post("/users", json=user_data)
assert res.status_code == 201
return res.json()
def test_user_can_be_retrieved(client, created_user):
res = client.get("/users/1")
assert res.status_code == 200
user = res.json()
assert user.username == created_user.username
# etc.