测试vim插件私有函数

时间:2015-04-09 20:31:08

标签: vim

我正在创建一个vim插件,它有几个私有函数,我正在尝试使用vim-vspec向它添加单一测试。

在测试文件中调用这些私有函数的最佳方法是什么?

现在,我创建了一个调用私有函数的公共函数,但我不认为这是一个很好的方法,因为我已经失去了拥有私有函数的意义。这是一些代码

" File foo.vim (the plugin)

" Private function 
fu! s:foo(arg)
...
endfu

" Public function
fu! InvokeFoo(arg)
   call <SID>foo(a:arg)
endfu

" File foo-unittest.vim (the test file)
runtime! plugin/foo.vim

describe 'foo function'

    it 'should have some behavior'
        call InvokeFoo(...)
        " Some expectations ...
    end
end

我尝试为私有函数创建映射,但是当我调用exe map_combination时,它对测试缓冲区没有任何影响。

1 个答案:

答案 0 :(得分:0)

我找到了问题here的解决方案,它为变量提供了一种方法,为函数提供了另一种方法。

变量

对于变量,我使用了vim的范围。调用:帮助内部变量:

  

作用域名称本身可以用作词典。例如,到   删除所有脚本局部变量:

    :for k in keys(s:)
    :    unlet s:[k]
    :endfor

所以我通过在其字典中使用getter函数来访问:s范围:

fun! SScope()
    return s:
endfu

最后,变量s:variable将通过以下方式访问:

let l:scope = SScope()
echom l:scope['variable']

功能

由于<SID>字符串,函数有点复杂。如果您阅读了手册,那么

  

执行map命令时,Vim会用{替换<SID>   特殊密钥代码,紧随其后   通过脚本独有的数字和下划线。例如:

     

:map <SID>Add可以定义映射“23_Add”。

因此,我们需要访问此唯一编号,其中一种方法是使用函数内的maparg定义将用作访问者的地图:

fu! SID()
    return maparg('<SID>', 'n')
endfu

nnoremap <SID> <SID>

然后,为了调用该函数,我们将进行一些黑客攻击:

call call(substitute('s:my_function', '^s:', SID(), ''), [arg1, arg2, ...])