pytest中如何验证mock返回对象的private_bytes方法是否被调用一次
你需要获取serialization.load_pem_private_key返回的mock实例,再对该实例的private_bytes方法做调用断言即可,调整后的测试代码如下:
@patch("builtins.open", new_callable=mock_open) def test_get_private_key(mock_open, mocker, key_path="my/path"): # 拿到mock后的serialization对象 mock_serialization = mocker.patch.object(subject, "serialization") # 提取load_pem_private_key返回的mock p_key实例 mock_p_key = mock_serialization.load_pem_private_key.return_value # 调用被测函数,若你实际被测函数是get_sf_connection,请补全所有必填参数 subject._get_private_key(key_path) # 原有断言 mock_open.assert_called_with(key_path, "rb") mock_serialization.load_pem_private_key.assert_called_once() # 新增断言:验证private_bytes调用次数和参数是否符合预期 mock_p_key.private_bytes.assert_called_once_with( encoding=mock_serialization.Encoding.DER, format=mock_serialization.PrivateFormat.PKCS8, encryption_algorithm=mock_serialization.NoEncryption(), )
逻辑说明
你mock了整个serialization模块后,load_pem_private_key的默认返回值是一个MagicMock实例,我们将这个实例单独提取出来,就能跟踪它身上所有方法的调用情况。上述代码不仅验证了private_bytes被调用了一次,同时还验证了传参和预期一致,比仅验证调用次数的覆盖度更完整。
注意:如果你实际调用的是贴出的
get_sf_connection函数,需要补全usr、acc、vwh、db四个必填入参,否则会触发参数缺失报错。
内容的提问来源于stack exchange,提问作者Blue Moon
相关产品推荐
相关产品推荐

