在另一个文件中模拟一个函数,在另一个文件中模拟一个类

时间:2015-11-09 23:01:34

标签: python unit-testing mocking patch

我注意到类方法被正确地模拟了,但是该函数绕过了mock并运行了实际的函数。

from module1 import myClass
from module2 import my_function
import unittest
from mock import patch

class TestStuff(unittest.TestCase):
    @patch('module2.my_function')
    @patch('module1.myClass.my_method')
    def test_my_function(self, mock_method, mock_function):
        test_obj = myClass()
        test_obj.my_method()
        assert mock_method.called
        my_function()
        assert mock_function.called

如果我打印出my_function()并输入(my_function),它将不会显示模拟,而是显示真实的功能。我导入一个类然后嘲笑一个方法,但我直接导入该函数是否重要?

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。结果我需要给它my_function的完整路径:

@patch(' home.myuser.myprojects.mymodule.myfunc&#39)

答案 1 :(得分:1)

我想我发现了这个问题: 当我测试一个函数,并且我想要模拟它时,我不应该导入它。导入它会导致它被使用,即使我已经放置了补丁装饰器。 我认为这是关于模拟/测试如何工作的一般混淆。我想要做的是在不实际查询数据库的情况下测试函数。我没有嘲笑整个函数,而是采用实际命中db - query.all()的行 - 并将其作为自己的函数,然后将其模拟出来。

from module1 import myClass
from module2 import my_function

import unittest
from mock import patch

class TestStuff(unittest.TestCase):
    @patch('module2.db_query')
    @patch('module1.myClass.my_method')
    def test_my_function(self, mock_method, mock_db_query):
        test_obj = myClass()
        test_obj.my_method()
        assert mock_method.called
        my_function()  # my_function calls db_query(), now mocked out
        assert mock_db_query.called

如果我想要实际模拟my_function的全部内容,我可能只是没有导入它。至少我是如何理解这一点的。

相关问题