以下是我要测试的内容:
test.py
class MyTest(TestCase)
def test1(self):
data = crawl_data()
Check data lengh and current data in DB...
function2()
Again, Check data lengh and current data in DB...
程序代码:
a.py
def crawl_data():
"""
crawl data from web
"""
.
.
return web_crawled_data
b.py
from a import crawl_data
def function2():
"""
crawl data and store new data in database
"""
.
.
result = crawl_data()
.
.
update data and update Database
.
.
我想要做的是测试function2()
。问题是function2()
内部调用crawl_data()
。
我不希望crawl_data()
在测试中抓取来自网络的数据,所以我尝试模拟此功能。
@patch("a.crawl_data")
def test1(self, crawl_data):
crawl_data.return_value = [("112233", "ABCDEF"), ("222233", "EFGHIJ")]
data = crawl_data()
Check data length and current data in DB
function2()
Check the database whether new data stored in DB
当我运行测试时,function2()
仍在实际抓取来自网络的数据!
我不想模拟function2的原因是,当我开始测试时,测试框架使用虚拟数据库(由django
提供)!
所以,我想做的是当crawl_data()
在里面调用它时将function2()
作为模拟。
我该怎么做?
的修改
我按照解决方案" Martijn Pieters♦"给出并实现如下代码:
a.py
def sum():
return 1
b.py
from a import sum
def calling_sum():
return sum()
test1.py
@patch("b.sum")
def test_sum(self, sum):
sum.return_value = 10
print(calling_sum())
结果
打印出" 1"而不是10 ....
我尝试将@patch("b.sum")
更改为@patch("b.fake_sum")
以检查是否正确导入,@patch("b.fake_sum")
发生错误(类似fake_sum not exsits
),所以我认为importing module
运作良好
仍然无法工作..
答案 0 :(得分:1)
您正在修补crawl_data
的错误引用; b
模块直接引用该函数,修补a.crawl_data
不会触及。在b
:
@patch("b.crawl_data")
def test1(self, crawl_data):
crawl_data.return_value = [("112233", "ABCDEF"), ("222233", "EFGHIJ")]
另请参阅mock
模块文档的Where to patch section。
在测试中使用data = crawl_data()
没有意义,测试你的模拟没什么意义。