Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 3.x 覆盖条件测试的pathlib.Path.exists_Python 3.x_Python Unittest.mock - Fatal编程技术网

Python 3.x 覆盖条件测试的pathlib.Path.exists

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

我想使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 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”]))