os.listdir 的模拟补丁不适用于单元测试

Mocked patch of os.listdir not working for unittesting

我有一个要测试的 class 方法,它需要两个修补方法,ConfigB.__init__listdir:

from os import listdir
from config.ConfigB import ConfigB

class FileRunner(object):
  def runProcess(self, cfgA)
    cfgB = ConfigB(cfgA)
    print(listdir())

我设置了以下测试:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
  @mock.patch('ConfigB.ConfigB.__init__')
  @mock.patch('os.listdir')
  def test_methodscalled(self, osListDir, cfgB):
    
    cfgA = MagicMock()
    fileRunner = FileRunner()

    cfgB.return_value = None
    osListDir.return_value = None

    fileRunner.runProcess(cfgA)

现在补丁模拟和 return 值适用于 ConfigB.ConfigB,但不适用于 os.listdir。当 print(listdir()) 方法运行时,我得到当前目录中的文件列表,而不是我在修补后的 return 值中指定的 None 值。知道出了什么问题吗?

您需要修补代码的相对路径。 patch('os.listdir') 不起作用,因为您需要修补它:

@mock.patch("path.to.your.pythonfile.listdir")

尝试一下。