对调用vim子进程的Python函数进行单元测试
我写了一个函数,当调用时会打开一个vim编辑器,并且可以指定文件名。请问我该如何对这种操作进行单元测试呢?
2 个回答
5
这已经不是单元测试了,而是集成测试。你为什么需要启动vim呢?通常情况下,你会使用“模拟”这个方法,模拟这个过程的启动,并依赖于Python的subprocess模块已经经过良好的测试。
要在你的代码中实现这个,你可以举个例子,创建一个你功能实现的类的子类,并重写负责启动的那个方法。然后对这个子类进行测试。也就是说:
class VimSpawner(object): # your actual code, to be tested
...
def spawn(self):
... do subprocess magic
def other_logic(self):
...
self.spawn()
class TestableVimSpawner(VimSpawner):
def spawn(self):
... mock the spawning
self.ididit = True
class Test(..):
def test_spawning(self):
t = TestableVimSpawner()
t.other_logic()
self.failUnless(t.ididit)
6
要对这样的代码进行单元测试,你需要模拟或替代掉一些依赖的部分。比如说,你可能是通过调用 os.system("vim") 来启动 vim 编辑器。
在你的单元测试中,你可以用一种方式来替代这个函数调用,比如这样:
def launchVim():
os.system("vim")
def testThatVimIsLaunched():
try:
realSystem = os.system
called = []
def stubSystem(command):
if command == "vim":
called.append(True)
os.system = stubSystem
launchVim() # function under test
assert(called == [True])
finally:
os.system = realSystem
想了解更多关于模拟和替代的内容,可以看看 这篇文章
更新:我添加了 try/finally 语句,以便在测试结束后恢复原来的系统函数,这是 Dave Kirby 的建议。