我有一个继承的子类,这两个类都使用参数解析器模块。如何模拟特定的参数解析器,使我的测试返回基类中的参数解析器的假数据,而不是子类中的参数解析器?
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),但是这个补丁似乎都是调用的。
发布于 2022-10-06 19:57:15
您可以选择限制修补程序的范围。mock.patch可以在with语句中使用,而不是作为修饰器使用:
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设置为一个函数时,它将被传递参数,其返回值将是修补函数的返回值。
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)https://stackoverflow.com/questions/73978850
复制相似问题