在我的
get_orders.py
文件中,我正在导入一个名为 admin_only
的函数,该函数存在于给定路径 (src.lib.authorization
) 处。在我的 test_get_orders.py
文件中,我试图修补这个函数,但是该函数没有被修补,并且在运行 pytest 时,它尝试调用该函数的底层代码而不是返回 True。为什么会出现这种情况?我该如何解决这个问题?
# get_orders.py
import boto3
import os
from fastapi import APIRouter, Depends
from aws_lambda_powertools import Logger
from fastapi.exceptions import HTTPException
from src.models import Order
from src.lib.dynamodb import DynamoConnection
from src.lib.response import fastapi_gateway_response
from src.lib.authorization import admin_only
logger = Logger()
router = APIRouter()
orders_table = DynamoConnection(
os.environ.get("DYNAMODB_REGION", "us-east-1"),
os.environ.get("DYNAMODB_ENDPOINT_URL", None),
os.environ.get("DYNAMODB_ORDERS_TABLE_NAME", "orders"),
).table
@logger.inject_lambda_context
@router.get(
"/orders",
status_code=200,
dependencies=[Depends(admin_only)],
)
def get_orders():
logger.info(f"Getting orders")
dynamo_response = orders_table.scan()
if "Items" not in dynamo_response:
raise HTTPException(status_code=404, detail="No orders found")
orders = [Order(**o).clean() for o in dynamo_response.get("Items")]
logger.info(f"Returning {len(orders)} orders")
return fastapi_gateway_response(200, {}, orders)
#test_get_orders.py
import pytest
import logging
from unittest.mock import patch
from freezegun import freeze_time
from botocore.stub import Stubber
from fastapi.testclient import TestClient
from src.api import app
from src.routes.get_orders import orders_table
logger = logging.getLogger()
test_client = TestClient(app, headers={"Authorization": "Bearer TOKEN"})
@pytest.fixture(autouse=True, scope="function")
def orders_dynamodb_stub():
with Stubber(orders_table.meta.client) as ddb_stubber:
yield ddb_stubber
ddb_stubber.assert_no_pending_responses()
@freeze_time("2024-03-22 12:00:00")
@patch("src.routes.get_orders.admin_only", return_value=True)
def test_handler_valid_event_get_orders(orders_dynamodb_stub):
orders_dynamodb_stub.add_response(
"scan",
{
"Items": [
{
"order_id": {"S": "ORDER-1"},
"dessert_id": {"S": "DESSERT-1"},
"dessert_name": {"S": "Chocolate Cake"},
"quantity": {"N": "1"},
"customer_first_name": {"S": "jane"},
"customer_last_name": {"S": "doe"},
"customer_email": {"S": "[email protected]"},
"customer_phone_number": {"S": "555-555-5555"},
"customer_zip_code": {"S": "90210"},
"delivery_address": {"S": "123 Main St, Los Angeles, CA 90210"},
"scheduled_delivery_time": {"N": "1711108800"},
"order_total": {"N": "10.00"},
"order_status": {"S": "NEW"},
"order_date": {"N": "1711108800"},
},
],
},
expected_params={"TableName": "orders"},
)
response = test_client.get("/v1/orders")
pytest.helpers.assert_responses_equal(
response,
200,
[
{
"order_id": "ORDER-1",
"dessert_id": "DESSERT-1",
"dessert_name": "Chocolate Cake",
"quantity": 1,
"customer_first_name": "jane",
"customer_last_name": "doe",
"customer_email": "[email protected]",
"customer_phone_number": "555-555-5555",
"customer_zip_code": "90210",
"delivery_address": "123 Main St, Los Angeles, CA 90210",
"scheduled_delivery_time": 1711108800,
"order_total": 10.00,
"order_status": "NEW",
"order_date": 1711108800,
}
],
)
在这条线上
@patch("src.routes.get_orders.admin_only", return_value=True)
您正在尝试从
src.routes.get_orders
调用该函数
@patch("src.lib.authorization.admin_only", return_value=True)
这应该有效。