单元测试一个调用vim子进程的python函数

pku*_*mar 5 python unit-testing

我写了一个函数,在调用时打开一个带有给定文件名的vim编辑器.如何进行这些类型操作的单元测试....

Mat*_*ela 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
Run Code Online (Sandbox Code Playgroud)

有关模拟和存根的更多详细信息,请查看本文

更新:我添加了try/finally以恢复Dave Kirby建议的原始系统功能


Ivo*_*ijk 5

这不再是单元测试,而是集成测试。为什么需要启动 vim?通常,您会“模拟”它,模拟进程生成,并依赖于 python 的子进程模块经过良好测试的事实。

例如,要在代码中实现此目的,您可以对实现您的功能的类进行子类化,并重写负责生成的方法。然后测试这个子类。IE

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)
Run Code Online (Sandbox Code Playgroud)