【发布时间】:2015-07-09 00:18:37
【问题描述】:
假设一个项目中有两个包:some_package 和 another_package。
# some_package/foo.py:
def bar():
print('hello')
# another_package/function.py
from some_package.foo import bar
def call_bar():
# ... code ...
bar()
# ... code ...
我想测试 another_package.function.call_bar 模拟 some_package.foo.bar 因为它有一些我想避免的网络 I/O。
这是一个测试:
# tests/test_bar.py
from another_package.function import call_bar
def test_bar(monkeypatch):
monkeypatch.setattr('some_package.foo.bar', lambda: print('patched'))
call_bar()
assert True
令我惊讶的是,它输出 hello 而不是 patched。我试图调试这个东西,在测试中放置一个 IPDB 断点。当我在断点后手动导入some_package.foo.bar 并调用bar() 时,我得到patched。
在我的真实项目中,情况更加有趣。如果我在项目根目录中调用 pytest,我的函数不会被修补,但是当我指定 tests/test_bar.py 作为参数时 - 它可以工作。
据我了解,这与from some_package.foo import bar 声明有关。如果它在monkeypatching 发生之前执行,则修补失败。但是在上面示例中的压缩测试设置中,补丁在这两种情况下都不起作用。
为什么它在遇到断点后在 IPDB REPL 中起作用?
【问题讨论】:
标签: python unit-testing pytest