2013-03-24 11 views
6

Używam testowania wtyczki Vima do testowania jednostkowego. Wszystko działa, ale szukam lepszego/kanonicznego sposobu wykonywania lokalnych funkcji skryptowych. Ponieważ nie są one bezpośrednio widoczne poza scenariuszem, obecnie ujawniam skrypt <SID> i wysyłam go do moich wywołań, aby je uruchomić.Testowanie jednostek Funkcje lokalne skryptu Vima za pomocą programu Vimrunner

muszę dodać ten kod do mojego pluginu do odsłonięcia SID:

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

To narazi SID jako przykład <SNR>18_. Ponieważ funkcje Vim są globalne, a tylko nazwa-munged, funkcje skryptowe lokalne mogą być wywoływane spoza skryptu poprzedzając SID:

:call <SNR>18_some_function() 

Potem zrobić to w ciemno:

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 

Czy jest lepszy sposób to zrobić?

Odpowiedz

5

Najprostszym sposobem jest po prostu udostępnianie funkcji lokalnych skryptu: Przekręć s:MyFunc w MyPlugin#MyFunc. W końcu widoczność funkcji jest tylko konwencją; nic (z wyjątkiem nieporęcznego wyszukiwania nazw) uniemożliwia wywoływanie funkcji lokalnych skryptów.

Czasami odbiegam od tego i chcę wywoływać testy z funkcji skryptowych. Moje podejście jest dość podobne do twojego, ale zamiast ujawniać <SID> z wtyczki, napisałem funkcje pomocnicze do analizy <SID> z wyjścia :scriptnames. Jest wolniejszy (nie obchodzi mnie, moje testy są testami integracyjnymi), ale nie muszę zanieczyszczać samej wtyczki kodem testowym. Oto przykład pokazujący Sid() i SidInvoke() pomocników:

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 
+0

Zmierzałem w tym kierunku, ale nie mam ochoty na testowanie. Wiem, że to naprawdę nie ma znaczenia, ale lubię zachować przestrzeń nazw tak znaczącą, jak pozwala Vim. Podoba mi się pomysł przeanalizowania go z ': scriptnames', aby uniknąć wprowadzania kodu testowego do produkcji. Wciąż otwarte na inne sugestie. –

+0

Próbowałem zastąpić moje s: MyFunction() MyPlugin # MyFunction(), ale wtedy wywołanie go w mapowaniu w tym samym pliku wydaje się nie działać. Czy coś mi umyka? – NicolasWebDev

+0

@Sathors: 'MyPlugin' musi być dokładną nazwą twojej wtyczki, oczywiście. –

1

to wykorzystać, aby uzyskać numer skryptu:

let sid = matchlist(execute('scriptnames'), '\([0-9]\+\): [^ ]*autoload/my_vimscript.vim')[1] 

a to wywołanie funkcji skryptu lokalnego (s:Test() w tym przykładzie)

execute("call <snr>" . sid . "_Test()") 
Powiązane problemy