我很确定我已经看过这个,但我无法正确理解语法。我想覆盖一个模块"常数"在测试期间。我可以写这样的代码:
import mymodule
try:
hold = mymodule.FOO
mymodule.FOO = 'test value'
do_something()
finally:
mymodule.FOO = hold
在我看来,应该有一种方法可以用"用"声明,如:
with mymodule.FOO = 'test value':
do_something()
我的思想欺骗了我吗?是否有一个简单的语法来做我想要的?
答案 0 :(得分:5)
听起来像你想要的unittest.mock.patch
:
from unittest.mock import patch
with patch('mymodule.Foo', 'test value'):
do_whatever()
如果您使用的是3.3之前的Python版本,则unittest.mock
不存在,但PyPI上可以使用backport。您也可以编写自己的上下文管理器来执行此操作。但是,语法中没有任何内容可以做到这一点。
答案 1 :(得分:1)
通常这称为monkeypatching。
unittest.mock
为此提供了帮助方法(如另一个答案所示),但在Python stdlib之外,我建议查看py.test
's monkeypatching fixture:
def test_foo(monkeypatch):
monkeypatch.setattr('mymodule.FOO', 'test value')
# more code here
# ...
# the monkeypatch is automatically reverted at the end of the test