gpt4 book ai didi

python - 如何测试在模拟时是否使用 "self"调用实例的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 14:45:01 27 4
gpt4 key购买 nike

我正在使用unittest.mock ,这个美妙的图书馆。然而,我对意外的行为感到惊讶,并且我没有看到明显的解决方案。我将它用于我的单元测试,完全理解它的行为对于进行有用的测试至关重要。

我知道 show_bar 中的以下代码已损坏,它正在调用类方法而不是实例方法。然而,我所有的mock 单元测试正在通过:

包含错误的代码:

class Foo(object):
def bar(self):
return "bar"

def show_bar(self):
return Foo.bar()

预期用途:

foo = Foo()
assert foo.show_bar() == "bar"
# => throw exception: bar() missing 1 required positional argument: 'self'

Unittest 尝试使用 mock 捕获此错误,但未成功:

from unittest.mock import patch
with patch.object(Foo, 'bar', return_value="bar") as mock:
foo = Foo()
assert foo.show_bar() == "bar"
mock.assert_called_once()
# => no errors

理想情况下,我想断言bar被调用 self.bar()而不是Foo.bar() ;这是错误的。不幸的是,使用 mock.assert_called_with()不考虑self也不cls参数,所以我有点困惑。

编辑:试图澄清。我正在寻找使用该库的最佳实践 unittest.mock当我们需要修补对象的方法时。我似乎不清楚如何修补它,目前我无法断言它是否正在调用 self.barFoo.bar .

最佳答案

我真的不明白为什么你需要模拟该方法来测试它在调用时不会引发 TypeError 但无论如何......其他人可能会解释如何使用 unittest.mock< 来解决这个问题,同时你可以跳过 unittest.mock 并自己模拟 Foo.bar:

 callargs = dict()  
def mock_bar(self):
callargs["self"] = self
return "bar"

foobar = Foo.__dict__["bar"]
Foo.bar = mock_bar
try:
foo = Foo()
assert foo.show_bar() == "bar"
assert "self" in callargs
assert callargs["self"] is foo
finally:
Foo.bar = foobar

关于python - 如何测试在模拟时是否使用 "self"调用实例的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46298781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com