Python 3.x 在Pytest中,如何检查一个方法是否是从另一个方法调用的?

Python 3.x 在Pytest中,如何检查一个方法是否是从另一个方法调用的?,python-3.x,mocking,pytest,Python 3.x,Mocking,Pytest,我正在使用Python 3.8和pytest 6.0.1。我有这门课 class MyHelperService:     def __init__(self, args):         ...     def my_method1(self):      ... logic here ...   然后在另一个类中,我从上面调用该方法 def main(req: func.HttpRequest) -> func.HttpResponse: ...      

我正在使用Python 3.8和pytest 6.0.1。我有这门课

class MyHelperService:
    def __init__(self, args):
        ...

    def my_method1(self):
        ... logic here ...  
然后在另一个类中,我从上面调用该方法

def main(req: func.HttpRequest) -> func.HttpResponse:
        ...
                sb = MyHelperService(args)
                sb.my_method1()
在pytest中,我如何模拟“my_method1”,以便在不必执行其中所有逻辑的情况下测试它是否被调用

def test_run_it():
    ...
    resp = _import.main(req)

假设
MyHelperService
位于
my\u project/my\u helper\u service.py
my\u project/main.py
中的
main
,并假设在
main
中导入类,如下所示:

来自my_项目。my_helper_服务导入MyHelperService
您可以这样修补您的方法(根据注释,我假设您使用另一个fixture
my_fixture
):

从unittest导入模拟
@mock.patch(“my_project.main.MyHelperService.my_method1”)
def测试运行(方法1模拟,我的夹具):
...
resp=_import.main(请求)
method1_mock.assert_调用了_once()
这将用一个只记录所有调用而不执行原始代码的模拟来替换
method1
。请注意,模拟参数是位置参数,因此大多数是第一个参数,而夹具参数是关键字参数(必须位于位置参数之后)

或者,您可以使用上下文管理器版本:

def test\u run\u it(我的夹具):
...
使用mock.patch(“my_project.main.MyHelperService.my_method1”)作为method1\u mock:
resp=_import.main(请求)
method1_mock.assert_调用了_once()
mocker
版本,如果您已安装
pytest mock

def test_run__it(mocker,my_fixture):
...
method1\u mock=mocker.patch(“my\u project.main.MyHelperService.my\u method1”)
resp=_import.main(请求)
method1_mock.assert_调用了_once()
一些有用的链接:

  • 这是Ned Batcheld写的
  • 这是Python中的模拟

在测试中使用
@mock.patch(“您的\u模块.MyHelperService.myu方法1”)
。检查的文件。然后,您可以在mock上使用
assert\u run\u…
方法。这对pytest有效吗?是的,有效。还有
pytest-mock
插件,它提供了
mocker
夹具(它包装了
unittest.mock.patch
),尽管您不需要它。关于这一点有很多问题(我自己也回答了一些),所以应该有很多例子。我没有找到与我的情况相关的例子。也许我遗漏了什么。我添加了一个通用答案,请检查它是否符合您的用例。第二个解决方案对我来说非常有效。我正在将一个fixture传递到测试中,我认为第一个解决方案导致将mock应用到fixture中,但使其工作,这是最主要的。我明天会回来赏金的,也许你的订单搞错了-我在答案中的示例中添加了一个装置来澄清这一点。