2

我想模拟某个模块以测试使用该模块的一段代码。

也就是说,我有一个my_module要测试的模块。my_module导入一个外部模块real_thing并调用real_thing.compute_something()

#my_module
import real_thing
def my_function():
    return real_thing.compute_something()

我需要模拟real_thing,以便在测试中它的行为类似于fake_thing我创建的模块:

#fake_thing
def compute_something():
    return fake_value

测试调用my_module.my_function()which 调用real_thing.compute_something()

#test_my_module
import my_module
def test_my_function():
    assert_something(my_module.my_function())

我应该在测试代码中添加什么以便在测试中my_function()调用fake_thing.compute_something()而不是real_thing.compute_something()

我试图弄清楚如何使用Mock做到这一点,但我没有。

4

2 回答 2

1

简单地说没有?破解 sys.modules

#fake_thing.py
def compute_something():
    return 'fake_value'

#real_thing.py
def compute_something():
    return 'real_value'

#my_module.py
import real_thing
def my_function():
    return real_thing.compute_something()

#test_my_module.py
import sys

def test_my_function():
    import fake_thing
    sys.modules['real_thing'] = fake_thing
    import my_module
    print my_module.my_function()

test_my_function()

输出:'fake_value'

于 2012-08-29T20:29:20.637 回答
0

http://code.google.com/p/mockito-python/

>>> from mockito import *
>>> dog = mock()
>>> when(dog).bark().thenReturn("wuff")
>>> dog.bark()
'wuff'

http://technogeek.org/python-module.html - 如何替换,动态加载模块

于 2012-08-29T19:13:36.633 回答