对于相当令人困惑的标题感到抱歉,但发现很难获得一个清晰的标题。
我的问题:
我有一个正在测试的子模块,可以调用它backend
。我在random.choice
中使用backend
。我在我的测试中修补它,这是有效的。它是补丁。 backend
导入pymongo
以执行某些数据库操作,pymongo也使用random.choice
来选择core.py
中的正确服务器。
我的backend.random.choice
补丁也用于backend.pymongo.random.choice
。我不知道为什么。这是正确的行为吗?如果是,那么解决这个问题的方法是什么?优先不改变后端和pymongo中的任何代码,但仅限于我的测试。
其他调查:
我设置了一个小测试构造,看看这是否与我的项目或一般事物有关。
我创建了一些模块:
酒吧/ bar.py
import random
def do_some_other_something():
return random.choice([10])
富/ foo.py
import random
from bar.bar import do_some_other_something
def do_something():
return random.choice([1])
def do_something_else():
return do_some_other_something()
一个测试用例:
from foo.foo import do_something, do_something_else
from unittest import mock
assert(do_something() == 1) # check
assert(do_something_else() == 10) # check
with mock.patch("foo.foo.random.choice") as mock_random_choice:
assert (do_something() != 1) # check (mocked as expected)
assert (do_something_else() == 10) # assertion! also mocked
所以我对此感到很困惑。我明确地嘲笑了foo.foo的random.choice而不是bar.bar' s。那为什么会这样呢?意?有办法解决这个问题吗?
谢谢!
答案 0 :(得分:1)
程序中只有一个random
模块。当foo.foo
和bar.bar
import random
时,他们共享 random
模块。修补choice
模块上的random
函数会修改程序每个部分使用的random
模块,包括foo.foo
和bar.bar
。
而不是修补foo.foo.random.choice
,修补foo.foo.random
。这取代了foo.foo
对random
模块的引用,而不是bar.bar
的引用。 bar.bar
将继续访问真实random
模块,但foo.foo
会看到模拟random
。