Python 如何测试创建目录的函数?

Python 如何测试创建目录的函数?,python,unit-testing,testing,Python,Unit Testing,Testing,如何在Python中测试创建目录的函数?您能否给出一个示例make\u directory\u test()函数 def make_directory(directory): if not os.path.exists(directory): os.makedirs(directory) 只需测试目录是否存在 def test_make_directory(self): directory_path = '...' # somepath make_di

如何在Python中测试创建目录的函数?您能否给出一个示例
make\u directory\u test()
函数

def make_directory(directory):
    if not os.path.exists(directory):
        os.makedirs(directory)

只需测试目录是否存在

def test_make_directory(self):
    directory_path = '...' # somepath

    make_directory(directory_path)

    self.assertTrue(os.path.exists(directory_path))

并确保在
拆卸
设置
中每次测试后删除单元测试中创建的任何目录,以确保测试的独立性

这里的一个好做法是学习如何使用或

此外,您应该使用Python的框架

你在这里的目标不一定是确保某个东西被创建,而是它被调用。因此,您要做的是模拟外部调用,以帮助测试方法的正确流。所以在这种情况下,您应该模拟exists和makedir。然后确保它被调用。这将是一个可接受的单元测试。您可以这样做:

假设您的主代码位于一个名为my_module.py的模块中。因此,您可能希望创建一个测试文件,让我们将其命名为test.py以保持其简单性,并在单元测试中执行以下操作:

from mock import patch
import my_module
import unittest


class MyTest(unittest.TestCase):
    @patch('my_module.exists')
    @patch('my_module.makedirs')
    def test_create_dir(self, mock_make_dirs, mock_exists):
        mock_exists.return_value = True

        make_directory('thing_to_create')

        mock_make_dirs.assert_called_with('thing_to_create')
所以,这里发生的事情是,你告诉mock你想要模仿makedir并存在。您正在使用
mock\u exists.return\u值
指定的True返回exists。然后进行实际调用,模拟将在该方法调用中生效。
mock\u make\u dirs.assert\u called\u with
的最后一行将确保实际调用生成dir的方法

如果您仍想测试是否确实创建了某些内容

在这种情况下,您可以尝试使用上下文管理器,并创建一个临时文件夹进行测试,执行您的工作以测试您的方法以及您必须执行的任何其他操作,一旦您完成了工作,上下文管理器将自毁


有关上下文管理器的信息,请查看assert true上缺少a)。我认为
self.assertFalse(os.path.exists(directory\u path))
make\u directory
将改善情况之前,这是不必要的,因为我提到了所有单元测试都应该是独立的。因此,这样的东西应该总是在任何使用文件系统的测试中编写的。补丁函数不应该使用
@patch('os.path.exists')
等吗?Hi@VinceMiller。模拟补丁的经验法则是,模拟测试的位置,而不是模块定义的位置。医生们其实解释得很好。我还是有点困惑,希望你能澄清一下。我认为我们必须修补
os.path.exists
而不是
module
,否则它将是
AttributeError
。与此相似。嗨,加布里埃尔楚。我写了一个很快的例子来帮助说明。使用pytest运行测试。除一项外,所有测试都将失败。特别是对于
os.path.exists
示例,因为这是Python中的一个库,如果您模拟
os.path.exists
,它仍然可以工作,但我们希望避免这种情况,因为这实际上会在所有模块中模拟它。我们只对模拟当前正在测试的系统感兴趣,这就是我们想要测试的具体方法。[cont'd in next message]@GabrielChu-通过使用与测试位置相关的路径执行模拟,我们只是在该上下文中模拟它。现在,这就引出了我链接的示例。失败的测试向您展示了当您实际尝试模拟“您”通过引用其“定义”路径而不是在当前测试的代码部分中使用它编写的模块时会发生什么。我认为提供的例子应该有助于澄清发生了什么。你可以随意摆弄它,进行实验。