8

समस्या

मैं एक एलिक्सीर मॉड्यूल का परीक्षण करना चाहता हूं जो मेजबान सिस्टम के साथ इंटरैक्ट करता है और इसमें दुष्प्रभाव होते हैं। इस प्रश्न के लिए और इसे संक्षिप्त रखने के लिए, मान लीजिए कि यह कई निर्देशिकाओं का निर्माण है। परीक्षणों के चलने के बाद उन निर्देशिकाओं को निश्चित रूप से हटा दिया जाना चाहिए, और यदि परीक्षण (जो बहुत लंबे हैं) किसी भी कारण से खराब हो जाते हैं (खराब मॉड्यूल कोड, खराब परीक्षण कोड, आदि)।एलिक्सीर/एक्सयूनिट: टेस्टकेस से टियरडाउन/क्लीनअप विधि (on_exit) से संदर्भ पास करना संभव है?

मैं जानना चाहता हूं कि इस क्लीनअप चरण को सर्वोत्तम/सबसे सुंदर तरीके से कैसे हल किया जाए। मैंने ExUnit.Callbacks.on_exit/2 के प्रलेखन को देखा है, लेकिन इसके उदाहरण केवल सेटअप और सरल टियरडाउन (कोई पास राज्य शामिल नहीं है) के लिए हैं। मैंने ऑनलाइन भी खोज की है, लेकिन कुछ भी उपयोगी नहीं मिला है, इसलिए यह हो सकता है कि मेरा विचार स्वयं अच्छा न हो - मैं समस्या को हल करने के लिए सुझावों के लिए भी खुला हूं।

उदाहरण

defmodule SimpleTest do 
    use ExUnit.Case 

    setup_all do 
    ts = Time.utc_now |> Time.to_string 
    {:ok, [timestamp: ts]} 
    # paths to be cleaned are not yet known here 
    end 

    test "first test", context do 
    path = "/tmp/dir" <> context[:timestamp] 
    assert :ok == SimpleModule.mkdir(path) 
    assert :eexist == SimpleModule.mkdir(path) 
    # [path] should be passed on to cleanup 
    end 

    test "second test", context do 
    path = "/tmp/dir" <> context[:timestamp] 
    path2 = "/tmp/dir2" <> context[:timestamp] 
    SimpleModule.mkdir(path) 
    SimpleModule.mkdir(path2) 
    assert File.exists?(path) 
    assert File.exists?(path2) 
    # [path, path2] should be passed on to cleanup 
    end 

    defp cleanup(context) do 
    Enum.each(context[:dirs], fn(x) -> File.rmdir(x) end) 
    end 
end 

defmodule SimpleModule do 
    def mkdir(path) do 
    File.mkdir(path) 
    end 
end 

संभावित समाधान?

अब मैं प्रत्येक परीक्षण के बाद हटाने के लिए निर्देशिकाओं की एक सूची के साथ cleanup/1 पर एक कॉल जोड़ना चाहता हूं।

  • सीधे समारोह कॉलिंग प्रत्येक परीक्षा के अंत में: निम्नलिखित विचारों चीजें हैं जो मैं करने की कोशिश की है साधारण मामलों के लिए काम करता है, लेकिन अगर परीक्षण का मामला बेहद लूप होता है, यह मार दिया जाता है और सफाई अब और नहीं होता है ।
  • प्रत्येक परीक्षण के अंदर अद्यतन संदर्भ के साथ on_exit(fn -> cleanup(context) end) पर कॉल करना: ऐसा लगता है कि यह काम करता है, लेकिन अगर यह सिफारिश की जाती है तो मुझे पता नहीं लगाया जा सकता है और यदि यह परीक्षण (शुरुआत/अंत) के अंदर कॉल कहां रखना है, तो इससे कोई फर्क पड़ता है।
  • setup context फ़ंक्शन में कॉलिंग: दस्तावेज़ यह करता है, लेकिन मुझे नहीं पता कि इसे किसी भी नए राज्य/संदर्भ को कैसे पास किया जाए। ऐसा लगता है कि सभी संदर्भ पहले से ही सेटअप कार्यों में पूरी तरह से परिभाषित किए गए हैं।

शायद मैं भी इस समस्या overthinking कर रहा हूँ ... मैं सिर्फ अधूरा सफाई और जिसके परिणामस्वरूप अंतहीन प्रत्यावर्तन के साथ कुछ बुरा डिबगिंग अनुभव था (जो मेरे कोड द्वारा पकड़ा किया जाना चाहिए था, लेकिन अभी तक नहीं था), तो मैं बस चाहता हूँ यह सुनिश्चित करने के लिए कि मैं सही काम करता हूं और इसे सही तरीके से सीखता हूं। उन परीक्षणों के अलावा, इलीक्सिर अब तक एक बहुत ही सुखद और निर्दोष अनुभव है!

उत्तर

1

इस विशेष मामले में मैं केवल सेटअप फ़ंक्शन (आपका तीसरा समाधान) में on_exit कॉलबैक पंजीकृत करूंगा।

@test_dir "/tmp/base_test" 

setup do 
    File.mkdir(@test_dir) 

    on_exit fn -> 
    File.rm_rf @test_dir 
    end 
end 

और फिर अपने परीक्षण

में @test_dir अपने आधार निर्देशिका के रूप में उपयोग करें: अलग-अलग रास्तों को हटाने की

इसके बजाय, मूल निर्देशिका हटाना

संबंधित मुद्दे