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
相关产品推荐
相关产品推荐

