6

Vimrunnerを使用して Vim プラグインの単体テストを行っています。すべてが機能していますが、スクリプトローカル関数を実行するためのより良い/標準的な方法を探しています。それらはスクリプトの外部では直接表示されないため、現在スクリプトを公開して、スクリプト<SID>を実行するために呼び出しの前に追加しています。

SID を公開するには、このコードをプラグインに追加する必要があります。

function! s:SID()
  let fullname = expand("<sfile>")
  return matchstr(fullname, '<SNR>\d\+_')
endfunction
let g:my_plugin_SID = s:SID()

これにより、たとえば SID が公開され<SNR>18_ます。Vim 関数はすべてグローバルで名前が変更されているだけなので、スクリプト ローカル関数は SID をプレフィックスとしてスクリプトの外部で呼び出すことができます。

:call <SNR>18_some_function()

次に、仕様でこれを行います。

describe "s:reverse_string" do
  let!(:sid) { VIM.command("echo g:my_plugin_SID") }

  def reverse_string(string)
    VIM.command("echo #{sid}reverse_string('#{string}')")
  end

  it "does something" do
    reverse_string("foo").should == "oof"
  end
end

これを行うより良い方法はありますか?

4

2 に答える 2

5

最も簡単な方法は、単純にスクリプト ローカル関数を公開するs:MyFuncことMyPlugin#MyFuncです。結局のところ、関数の可視性は慣例によるものです。いずれにせよ、(面倒な名前検索を除いて) スクリプト ローカル関数の呼び出しを妨げるものは何もありません。

時々、私はそれから逸脱して、テストからスクリプト ローカル関数を呼び出したいと思うことがあります。私のアプローチはあなたのものと非常に似ていますが、プラグイン内で from を公開する代わりに、出力から from<SID>を解析するヘルパー関数を作成しました。遅いですが (気にしません。私のテストは統合テストです)、プラグイン自体をテスト コードで汚染する必要はありません。およびヘルパーを示す例を次に示します。<SID>:scriptnamesSid()SidInvoke()

let s:SID = Sid('autoload/EditSimilar/Substitute.vim')
function! s:Is( input, expected, description )
    let l:got = SidInvoke(s:SID, printf("IsWildcardPathPattern('%s')", a:input))
    call vimtap#Is(l:got, a:expected, a:description)
endfunction
于 2013-03-24T08:34:05.177 に答える