【问题标题】:Correct path of mock.patchmock.patch 的正确路径
【发布时间】:2015-09-24 22:34:07
【问题描述】:

在 Python 中使用 mock 时,我遇到了关于找出路径的问题。

假设我有以下文件

file1.py

def func1():
    return 'X'

file2.py

from file1 import func1

class ClassA():

    def func_that_uses_func1(self):
        x = func1()

如何在 ClassA 上修补 func1 的使用?我试过@mock.patch('file2.func1'),但我得到一个错误AttributeError: <class 'ClassA'> does not have the attribute 'func1'

【问题讨论】:

    标签: python unit-testing mocking python-unittest


    【解决方案1】:

    我认为您实际上想模拟 @mock.patch('file2.func1')。我下面的示例可能会有所帮助:

    from file2 import ClassA
    from mock import patch
    import unittest
    
    class TestClassA(unittest.TestCase):
        def setUp(self):
            self.c = ClassA()
    
        @patch('file2.func1')
        def test_func(self, m_func1):
            self.c.func_that_uses_func1()
    
            self.assertEqual(m_func1.called, 1)
    
    if __name__ == '__main__':
        unittest.main()
    

    【讨论】:

    • 嗨,我刚刚更新了我的问题,因为我已经使用引号将路径传递给补丁装饰器。
    • 我复制粘贴了您提供的代码,并使用了我发布的代码,并且模拟工作正常。你还有什么可以做的不一样的吗?
    • 我所做的唯一区别是在您的方法中添加了 self ,我在您的 OP 中对此进行了评论
    • 我试图使用导入路径,但由于某些奇怪的原因,只需要使用真实路径。你的回答让我走上了正确的道路。谢谢!
    • 谢谢。经过数小时的研究,这些由内而外的东西让我感到恶心,这很简单
    【解决方案2】:

    对于您的“必须使用真实路径”问题,您只需编写测试文件的最低共同祖先的路径和您要导入的文件。 如果你想使用导入的模块而不是字符串格式,我建议你使用patch.object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2020-05-10
      • 2021-10-24
      • 2019-03-25
      相关资源
      最近更新 更多