2013-03-24 18 views
6

के साथ मैं Vimrunner का उपयोग कर एक विम प्लगइन इकाई-परीक्षण करने के लिए उपयोग कर रहा हूं। सब कुछ काम कर रहा है, लेकिन मैं स्क्रिप्ट-स्थानीय कार्यों को निष्पादित करने के लिए एक बेहतर/कैनोलिक तरीका ढूंढ रहा हूं। चूंकि वे सीधे स्क्रिप्ट के बाहर दिखाई नहीं दे रहे हैं, इसलिए मैं वर्तमान में स्क्रिप्ट के <SID> का खुलासा कर रहा हूं और उन्हें चलाने के लिए अपनी कॉल में इसे प्रस्तुत कर रहा हूं।यूनिट परीक्षण वीम स्क्रिप्ट-स्थानीय कार्यों Vimrunner

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

कि जैसे के रूप में सिड सामने आ जाएगी:

मैं सिड बेनकाब करने के लिए मेरे प्लगइन के लिए इस कोड जोड़ने के लिए <SNR>18_

: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 

के बाद से विम कार्यों सभी वैश्विक, और सिर्फ नाम-munged हैं, पटकथा स्थानीय कार्यों सिड लगाकर द्वारा स्क्रिप्ट के बाहर लागू किया जा सकता है क्या ऐसा करने के लिए इससे अच्छा तरीका है?

उत्तर

5

स्क्रिप्ट-स्थानीय कार्यों को आसानी से बेनकाब करना सबसे आसान तरीका है: s:MyFuncMyPlugin#MyFunc में बदलें। आखिरकार, कार्य दृश्यता केवल सम्मेलन द्वारा ही है, वैसे भी; कुछ भी नहीं (बोझिल नाम लुकअप को छोड़कर) स्क्रिप्ट-स्थानीय कार्यों को बुलाए जाने से रोकता है, वैसे भी।

कभी-कभी, मैं उससे विचलित हूं और परीक्षण से स्क्रिप्ट-स्थानीय कार्यों को आमंत्रित करना चाहता हूं। मेरा दृष्टिकोण आपके जैसा ही है, लेकिन प्लगइन के भीतर से <SID> को उजागर करने के बजाय, मैंने :scriptnames आउटपुट से <SID> को पार्स करने के लिए सहायक कार्यों को लिखा है। यह धीमा है (मुझे परवाह नहीं है; मेरे परीक्षण एकीकरण परीक्षण हैं), लेकिन मुझे प्लगइन कोड के साथ प्लगइन को प्रदूषित करने की आवश्यकता नहीं है।

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

मैं उस दिशा में आगे बढ़ रहा था, लेकिन परीक्षण के लिए चीजों को अपनाने में संकोच नहीं कर रहा हूं। मुझे पता है कि यह वास्तव में कोई फर्क नहीं पड़ता है, लेकिन मैं नामस्थान को अर्थपूर्ण के रूप में रखना चाहता हूं क्योंकि विम अनुमति देता है। मुझे उत्पादन में परीक्षण कोड इंजेक्शन से बचने के लिए इसे 'स्क्रिप्ट नाम' से बाहर निकालने का विचार पसंद है। अभी भी अन्य सुझावों के लिए खुला है। –

+0

मैं MySugugin # MyFunction() के साथ MyS: MyFunction() को प्रतिस्थापित करने का प्रयास कर रहा हूं, लेकिन फिर उसी फ़ाइल में मैपिंग में इसे कॉल करने के लिए काम नहीं करना प्रतीत होता है। क्या मुझसे कोई चूक हो रही है? – NicolasWebDev

+0

@ साथर्स: 'मायप्लगिन' निश्चित रूप से आपकी प्लगइन का सटीक नाम होना चाहिए। –

1

उपयोग इस स्क्रिप्ट संख्या प्राप्त करने:: यहाँ Sid() और SidInvoke() सहायकों दिखा एक उदाहरण है

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

और इस एक स्क्रिप्ट-स्थानीय समारोह (इस उदाहरण में s:Test())

आह्वान करने के लिए
execute("call <snr>" . sid . "_Test()") 
संबंधित मुद्दे