首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修补how解析python的一个实例

如何修补how解析python的一个实例
EN

Stack Overflow用户
提问于 2022-10-06 18:59:33
回答 1查看 27关注 0票数 0

我有一个继承的子类,这两个类都使用参数解析器模块。如何模拟特定的参数解析器,使我的测试返回基类中的参数解析器的假数据,而不是子类中的参数解析器?

代码语言:javascript
运行
复制
class Parent:
  def __init__(self, argv):
     self.parser = ArgumentParser()
     self.args = parser.parse_known_args(argv)

class Child(Parent):
     super().__init__(argv)

     def need_these_args(self):
        self.parser = ArgumentParser()
        self.args = parser.parse_known_args(argv) 

我希望调用need_these_args中的解析器和args来返回一个真实的结果,但我只想模拟父调用。我正在针对Child类进行测试

我试过使用@patch.object(ArgumentParser, "parse_known_args", return_value=mock_arg_parse),但是这个补丁似乎都是调用的。

EN

回答 1

Stack Overflow用户

发布于 2022-10-06 19:57:15

您可以选择限制修补程序的范围。mock.patch可以在with语句中使用,而不是作为修饰器使用:

代码语言:javascript
运行
复制
def test_foo(self):
    with patch.object(ArgumentParser, "parse_known_args", 
                      return_value=mock_arg_parse):
        parent = Parent(argv)
    # child is outside the with statement, so it gets the original behaviour
    child = Child(argv)

如果argv在父级和子级之间有所不同,另一种选择是根据argv的值改变行为。您可以使用side_effect而不是return_value来实现这一点。当您将side_effect设置为一个函数时,它将被传递参数,其返回值将是修补函数的返回值。

代码语言:javascript
运行
复制
parent_argv = ['a', 'b', 'c']
parent_result = 'foo'

child_argv = ['x', 'y', 'z']
child_result = 'bar'

def mock_parse_known_args(argv):
    if argv == parent_argv:
        return parent_result
    else:
        return child_result

@patch.object(ArgumentParser, "parse_known_args", 
              side_effect=mock_parse_known_args)
def test_foo(self):
   parent = Parent(parent_argv)
   child = Child(child_argv)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73978850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档