为什么我的模拟没有为以下修补函数返回 True?

问题描述 投票:0回答:1

在我的

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,
            }
        ],
    )
python pytest fastapi python-unittest.mock
1个回答
0
投票

在这条线上

@patch("src.routes.get_orders.admin_only", return_value=True)

您正在尝试从

src.routes.get_orders

调用该函数
@patch("src.lib.authorization.admin_only", return_value=True)

这应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.