Python 在PyDev中使用mock运行单元测试与在命令行中运行单元测试的不同结果
我在一个类中有一个Python函数,该类运行带有子流程模块的Photoshop脚本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
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只需创建一个运行程序并捕获异常进行记录。我正在作为套件的一部分运行测试。好电话。我去查一下密码。