【问题标题】:Mocking a function in another file and a class in a second other file模拟另一个文件中的函数和另一个文件中的类
【发布时间】:2015-11-09 23:01:34
【问题描述】:

我注意到类方法已被正确模拟出来,但该函数绕过模拟并运行实际函数。

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() 和 type(my_function) 它不会显示模拟,而是真正的功能。我导入一个类然后模拟一个方法是否重要,但我直接导入函数?

【问题讨论】:

  • my_function 长什么样子?
  • 我的函数查询数据库并返回对象列表。我想模拟它以避免读取/写入数据库。类方法对第三方进行 API 调用,所以我也想模拟一下。

标签: python unit-testing mocking patch


【解决方案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,我可以不导入它。至少我现在是这么理解的。

【讨论】:

  • 我看不出问题代码和答案代码之间有什么区别,只是您将文本 my_function 更改为 db_query
【解决方案2】:

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

@patch('home.myuser.myprojects.mymodule.myfunc')

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2019-09-19
    • 2022-08-19
    • 2021-08-20
    • 2019-11-05
    相关资源
    最近更新 更多