我正在使用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.bar
或Foo.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/