Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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 在PyDev中使用mock运行单元测试与在命令行中运行单元测试的不同结果_Python_Unit Testing_Pydev_Python Mock - Fatal编程技术网

Python 在PyDev中使用mock运行单元测试与在命令行中运行单元测试的不同结果

Python 在PyDev中使用mock运行单元测试与在命令行中运行单元测试的不同结果,python,unit-testing,pydev,python-mock,Python,Unit Testing,Pydev,Python Mock,我在一个类中有一个Python函数,该类运行带有子流程模块的Photoshop脚本 def runPhotoshop(self): photoshop = r'C:\Program Files\Adobe\Adobe Photoshop CC 2014\Photoshop.exe' extendscript = os.path.join(os.getcwd(), 'someScript.jsx') returnCode = subprocess.c

我在一个类中有一个Python函数,该类运行带有子流程模块的Photoshop脚本

def runPhotoshop(self):
        photoshop = r'C:\Program Files\Adobe\Adobe Photoshop CC 2014\Photoshop.exe'
        extendscript = os.path.join(os.getcwd(), 'someScript.jsx')
        returnCode = subprocess.call([photoshop, extendscript])    
        return returnCode
每次启动单元测试都启动Photoshop是很昂贵的,所以我决定使用mock。MyTool类是先前从MyTool模块导入的

@mock.patch('mytool.subprocess')
def test_run_tool(self, mock_subprocess):
    # Need instance inside the test for patch to work
    tool = MyTool()

    # Patch in a mock subprocess module
    mock_subprocess.call.return_value = 0

    # Run the function and test the return value
    returnCode = mytool.runPhotoshop()
    self.assertEqual(returnCode, 0, "Javascript was not successful")

    # Was the subprocess function called?
    photoshop = r'C:\Program Files\Adobe\Adobe Photoshop CC 2014\Photoshop.exe'
    extendscript = os.path.join(os.getcwd(), 'someScript.jsx')
    mock_subprocess.call.assert_called_with([photoshop, extendscript])
当从命令行(Windows Powershell)运行时,此测试非常有效,而Photoshop从未启动,这正是我想要的

In method test_add_metadata_to_image_file
.
----------------------------------------------------------------------
Ran 1 test in 0.016s

OK
然而,当我在Eclipse Helios的PyDev插件中运行相同的单元测试时,不仅Photoshop启动,而且我得到一个断言错误:

AssertionError: Expected call: call(['C:\\Program Files\\Adobe\\Adobe Photoshop CC 2014\\Photoshop.exe', 'D:\\work_directory\\someScript.jsx'])
Not called

这不是我第一次注意到在PyDev中运行单元测试与在命令行中运行单元测试之间的区别。事实上,我正在考虑不再在PyDev中运行测试,而只使用命令行(更少的变量)。但是,我想知道发生了什么。

当您使用PyDev时,您只运行这个测试还是运行更复杂的测试套件?在
mytool
中,当您修补
mytool.subprocess
时,可能存在某种惰性初始化。将使用
subprocess
执行调用的引用已被记录,无法更改。请注意,如果命令行和PyDev都运行同一个套件,那么对于不同的测试顺序,可能会有不同的结果。如果PyDev中的使用
补丁
上没有已知的bug,我无法想象有什么可能:PyDev只需创建一个运行程序并捕获异常进行记录。我正在作为套件的一部分运行测试。好电话。我去查一下密码。