对调用vim子进程的Python函数进行单元测试

5 投票
2 回答
1493 浏览
提问于 2025-04-16 04:50

我写了一个函数,当调用时会打开一个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 的建议。

撰写回答