Python 3.x 覆盖条件测试的pathlib.Path.exists
我想使Path.exists()仅在测试特定路径时返回True:Python 3.x 覆盖条件测试的pathlib.Path.exists,python-3.x,python-unittest.mock,Python 3.x,Python Unittest.mock,我想使Path.exists()仅在测试特定路径时返回True: from unittest import TestCase from mock import patch import pathlib def fn(names): for index, name in enumerate(names): if pathlib.Path(name).exists(): return index class
from unittest import TestCase
from mock import patch
import pathlib
def fn(names):
for index, name in enumerate(names):
if pathlib.Path(name).exists():
return index
class T(TestCase):
@patch.object(pathlib.Path, 'exists', side_effect=lambda: self.name == "countme")
def test_fn(self, exists_mock):
self.assertEqual(2, fn(["not", "not", "countme", "not"]))
我也试过使用
@patch.object(pathlib.Path, 'exists', side_effect=lambda self: self.name == "countme")
你的代码几乎是正确的。以下是一个工作版本:
T类(测试用例):
@对象(pathlib.Path,'exists',lambda self:self.name==“countme”)
def测试(自身):
self.assertEqual(2,fn([“not”,“not”,“countme”,“not”]))
您对lambda的使用遗漏了lambda参数,因此您不必使用副作用
,只需替换函数即可。问题在于,
副作用
只是一个独立于实际函数调用的返回值(或返回值列表),因此使用lambda将不起作用-它不会以self
作为参数调用。取而代之的new
参数将替换实际函数,因此将使用正确的参数调用它
使用patch
的类似版本如下所示:
T类(测试用例):
@补丁('pathlib.Path.exists',lambda self:self.name==“countme”)
def测试(自身):
self.assertEqual(2,fn([“not”,“not”,“countme”,“not”]))