समस्या
मैं एक एलिक्सीर मॉड्यूल का परीक्षण करना चाहता हूं जो मेजबान सिस्टम के साथ इंटरैक्ट करता है और इसमें दुष्प्रभाव होते हैं। इस प्रश्न के लिए और इसे संक्षिप्त रखने के लिए, मान लीजिए कि यह कई निर्देशिकाओं का निर्माण है। परीक्षणों के चलने के बाद उन निर्देशिकाओं को निश्चित रूप से हटा दिया जाना चाहिए, और यदि परीक्षण (जो बहुत लंबे हैं) किसी भी कारण से खराब हो जाते हैं (खराब मॉड्यूल कोड, खराब परीक्षण कोड, आदि)।एलिक्सीर/एक्सयूनिट: टेस्टकेस से टियरडाउन/क्लीनअप विधि (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 कर रहा हूँ ... मैं सिर्फ अधूरा सफाई और जिसके परिणामस्वरूप अंतहीन प्रत्यावर्तन के साथ कुछ बुरा डिबगिंग अनुभव था (जो मेरे कोड द्वारा पकड़ा किया जाना चाहिए था, लेकिन अभी तक नहीं था), तो मैं बस चाहता हूँ यह सुनिश्चित करने के लिए कि मैं सही काम करता हूं और इसे सही तरीके से सीखता हूं। उन परीक्षणों के अलावा, इलीक्सिर अब तक एक बहुत ही सुखद और निर्दोष अनुभव है!