You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Mock Azure BlobServiceClient时get_container_client断言失败求助

单元测试中Azure BlobServiceClient的get_container_client调用断言失败问题

我正在编写单元测试测试azure.storage.blob.BlobServiceClient类及其方法,但遇到了断言失败的问题——明明在AzureBlob初始化时调用了get_container_client,测试却提示该方法未被调用。

相关代码

conftest.py 中的fixture

@pytest.fixture
def mock_BlobServiceClient(mocker):

    azure_ContainerClient = mocker.patch("azure.storage.blob.ContainerClient", mocker.MagicMock())

    azure_BlobServiceClient= mocker.patch("azure_module.BlobServiceClient", mocker.MagicMock())
    azure_BlobServiceClient.from_connection_string.return_value
    azure_BlobServiceClient.get_container_client.return_value = azure_ContainerClient
    azure_ContainerClient.list_blob_names.return_value = "test"
    azure_ContainerClient.get_container_client.list_blobs.return_value = ["test"]

    yield azure_BlobServiceClient

测试文件内容

from azure_module import AzureBlob


def test_AzureBlob(mock_BlobServiceClient):
    azure_blob = AzureBlob()

    # 该断言通过
    mock_BlobServiceClient.from_connection_string.assert_called_once_with("testconnectionstring")

    # 该断言失败
    mock_BlobServiceClient.get_container_client.assert_called()

azure_module.py 内容

from azure.storage.blob import BlobServiceClient
import os


class AzureBlob:

    def __init__(self) -> None:
        """Initialize the azure blob"""
        self.azure_blob_obj = BlobServiceClient.from_connection_string(os.environ["AZURE_STORAGE_CONNECTION_STRING"])
        self.azure_container = self.azure_blob_obj.get_container_client(os.environ["AZURE_CONTAINER_NAME"])

执行测试时的错误

>       mock_BlobServiceClient.get_container_client.assert_called()
E       AssertionError: Expected 'get_container_client' to have been called.

更新1:定位问题

我怀疑是unittest中MagicMock的bug。按照建议精简代码后,得到以下测试结果:

精简后的conftest.py

@pytest.fixture
def mock_Blob(mocker):
    yield mocker.patch("module.BlobServiceClient")

精简后的测试文件test_azureblob.py

def test_AzureBlob(mock_Blob):

    azure_blob = AzureBlob()
    print(mock_Blob)
    print(mock_Blob.mock_calls)
    print(mock_Blob.from_connection_string.mock_calls)
    print(mock_Blob.from_connection_string.get_container_client.mock_calls)
    assert False  # <- 故意失败

测试输出结果

$ pytest -vv
.
.
.
------------------------------------------------------------------------------------------- Captured stdout call -------------------------------------------------------------------------------------------
<MagicMock name='BlobServiceClient' id='140704187870944'>
[call.from_connection_string('AZURE_STORAGE_CONNECTION_STRING'),
 call.from_connection_string().get_container_client('AZURE_CONTAINER_NAME')]
[call('AZURE_STORAGE_CONNECTION_STRING'),
 call().get_container_client('AZURE_CONTAINER_NAME')]
[]
.
.
.

从打印内容可以清楚看到get_container_client被调用了,但mock的方法层级中没有记录这个调用,因此我认为MagicMock存在bug,准备向开发者提交报告。

内容的提问来源于stack exchange,提问作者gh0st

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:30:55