python模拟查找调用方法的位置

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

我正在开发一个有一些 pytests 的项目,在其中一个测试中我有以下行:

mocked_class = Mock()    
assert mocked_class.send.call_count == 1

现在我找不到代码中有人调用

send
方法的地方。 我尝试添加

mocked_class.send=my_method

并在其上添加打印或放置断点,但它不起作用。

看来我错过了一些东西

测试正在 python 3.8 上进行 与

import pytest
from mock import Mock

如何找到谁调用了这个方法? 调试此问题的任何其他帮助

python-3.x mocking pytest
2个回答
0
投票

send
可能不存在于您的代码中,因为它是
Mock
实例的一部分,并且您可以从
Mock
实例调用任意方法:

from unittest.mock import Mock

def test_1():
    mocked_class = Mock()
    mocked_class.wasda()
    assert mocked_class.wasda.call_count == 1

test_1()

文档中有很多示例:https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock

您的代码还应该引发“AssertionError”,因为在断言语句之前没有调用

send


0
投票

我想到了一种 hacky 的方法,但据我所知,它确实效果很好:

from unittest import mock
import traceback


class AdvancedCall(mock._Call):
    original_call_class = mock._Call

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.where = traceback.format_stack()

mock._Call = AdvancedCall

然后你可以做...

mocked_class = Mock() 
...   
assert mocked_class.send.call_count == 1
mocked_class.send.mock_calls[0].where  # Inspect this for the call stack
© www.soinside.com 2019 - 2024. All rights reserved.