繁体   English   中英

单元测试:修补 os join 覆盖测试文件中的 os join

[英]Unit test: patching os join overwrites os join in test file

我正在为使用os.makedirsos.path.join创建文件夹的函数编写单元测试。 当我尝试模拟 BuilddataHelpers 类中使用的特定 os.path.join 时,它还会修补测试文件中的os.path.join 我怎样才能专门修补os.path.join同时仍然使用被测试的文件中os.path.join在测试文件?

数据管理器/builddatahelpers.py

import os
PATH = 'not/test/data/either'

class BuilddataHelpers:
    def create_folder(self, folder_name):
        create_folder_path = os.path.join(PATH, folder_name)
        os.makedirs(create_folder_path, exist_ok = True)
        return path

数据管理器/数据管理器.py

class DataManager(BuilddataHelpers):
     ...

test_builddatahelpers.py

import os

class TestBuilddataHelpers(unittest.TestCase):
    global TEST_PATH 
    TEST_PATH = 'tests/data'

    def setUp(self):
        super(TestBuilddataHelpers, self).setUp()
        self.dm = DataManager()
    
    @patch('datamanager.builddatahelpers.os.path.join', return_value=TEST_PATH)
    def test_create_folder_structure_on_ftp(self, mock_os_join):
        folder_name = 'test_folder'
        self.dm.create_folder(folder_name)
        self.assertTrue(os.path.exists(os.path.join(TEST_PATH, folder_name)))
        print('SUBFOLDER PATH: ' , os.path.join('not', 'test', 'data'))

输出子文件SUBFOLDER PATH: tests/data 由于未修补os.makedirs该文件夹仍会创建。

在您测试的代码中,您执行import os ,这意味着将使用os.path.join而不是本地引用。 所以如果你这样做:

    @patch('datamanager.builddatahelpers.os.path.join', return_value=TEST_PATH)
    def test_create_folder_structure_on_ftp(self, mock_os_join):
        ...

这与编写完全相同:

    @patch('os.path.join', return_value=TEST_PATH)
    def test_create_folder_structure_on_ftp(self, mock_os_join):
        ...

只有在测试代码中使用了from x import y ,第一个版本才有意义。 在您的情况下, os.path.join将为使用它的所有模块修补。 如果要使用原始os.path.join ,则必须将其缓存在某处。 一种可能性是只使用:

from os.path import join

...
    @patch('os.path.join', return_value=TEST_PATH)
    def test_create_folder_structure_on_ftp(self, mock_os_join):
        folder_name = 'test_folder'
        self.dm.create_folder(folder_name)
        self.assertTrue(os.path.exists(join(TEST_PATH, folder_name)))
        print('SUBFOLDER PATH: ' , join('not', 'test', 'data'))

join保存的对os.path.join的本地引用不会被修补。 您还可以将其缓存为类变量:

import os

class TestBuilddataHelpers(unittest.TestCase):
    TEST_PATH = 'tests/data'
    join = os.path.join
...

    self.assertTrue(os.path.exists(self.join(TEST_PATH, folder_name)))

这将具有相同的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM