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

标签 python python-3.x unit-testing mocking python-mock

我正在使用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/

相关文章:

python-3.x - 如何在 spaCy 3.x 中的自定义实体标尺中删除/添加实体

python - 如何滞后 pandas 系列并创建新的时间滞后数据框?

python - 如何在 while 循环中每行显示 5 个数字

unit-testing - 设置 Mobile JUnit 测试以在 JUnit 下运行

android - 移动设备的自动化框架

Python 返回 True 或 False

python - 使用请求访问 url 时处理 Windows 身份验证

python - 用requests和BeautifulSoup解析leetcode题目内容

python - 将对象保存在 MemCache 而不是 Datastore 中

java - 是否可以模拟私有(private)静态最终字符串文字?