Python单元测试:模拟包装其他功能的功能?

时间:2018-02-07 11:51:25

标签: python django unit-testing mocking python-unittest

以下是我要测试的内容:

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运作良好

仍然无法工作..

1 个答案:

答案 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()没有意义,测试你的模拟没什么意义。