Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在调用期间修补pathlib并测试字符串_Python_Unit Testing_Mocking_Patch_Pathlib - Fatal编程技术网

Python 在调用期间修补pathlib并测试字符串

Python 在调用期间修补pathlib并测试字符串,python,unit-testing,mocking,patch,pathlib,Python,Unit Testing,Mocking,Patch,Pathlib,我开始使用pathlib,并且非常喜欢在大多数情况下使用它。我遇到的问题是,由于方法而不是函数的性质,测试它 def test_correct_dir_was_made(self): with patch('my.module.Path.mkdir') as mock_mkdir: check_dirs() mock_mkdir.assert_called_once() 在check_dirs函数中,动态生成路径,如果路径不存在,则创建路径。我可以确定如

我开始使用pathlib,并且非常喜欢在大多数情况下使用它。我遇到的问题是,由于方法而不是函数的性质,测试它

def test_correct_dir_was_made(self):
    with patch('my.module.Path.mkdir') as mock_mkdir:
        check_dirs()
        mock_mkdir.assert_called_once()

check_dirs
函数中,动态生成路径,如果路径不存在,则创建路径。我可以确定如何确保它被任意调用,但我的问题是我不确定如何捕获传递到Path.mkdir的self参数以检查其路径字符串是否正确。对于os.path,这更容易,因为模拟mkdir函数,我可以简单地断言它是用正确的字符串调用的。有什么想法吗?

我找到了一个好办法。试图模拟整个Path类被证明是非常复杂的,特别是因为我希望Path类能够完成除修改磁盘之外的所有正常行为。我发现,通过启用autospec,我现在可以断言调用,包括“隐藏”自变量,如下所示:

def test_correct_dir_was_made(self):
with patch('my.module.Path.mkdir', autospec=True) as mock_mkdir:
    check_dirs()
test_path = Path('path', 'to', 'test')
mock_mkdir.assert_called_once_with(test_path)

现在我可以很容易地断言,正确的目录应该已经生成。可能有一种方法可以用autospec模拟整个Path类并获得类似的结果,但是修补我不想要的方法,并且仍然能够在不直接访问调用该方法的实例的情况下进行断言,这似乎更明智。

mock_mkdir.assert_使用(“任意路径”)调用。
?这就是您需要的吗?这不起作用,因为在
check\u dirs
函数中创建的路径实例调用
.mkdir()
方法,并且从模拟对象中隐藏了从技术上传入的
self
参数。如果我尝试你所说的,它说预期的调用是
mkdir(“任何路径”)
,实际的调用是
mkdir()
mkdir()
没有定义参数,它是
path
类定义了要创建的目录。因此类
Path
将使用目录进行测试。为什么不包括您的checkdir()列表?这是一个更好的例子。另外,为什么checkdir不进行讨论?也许你可以生活在没有模拟和隐藏的全局状态下。你确定断言吗?由于其他参数如
exist\u ok
parents
未通过解决,我收到了错误,下面的断言对我有效:
assert mock\u mkdir.call\u args==call(path,exist\u ok=True,parents=True)