मुझे लगता है कि फ़ाइल नाम को स्वीकार करने और फ़ाइल को स्वयं खोलने के बजाय आउटपुट फ़ंक्शन को फ़ाइल हैंडल (या फ़ाइल-जैसी ऑब्जेक्ट ) को स्पष्ट रूप से स्वीकार करना पसंद है । इस तरह, मैं अपने यूनिट टेस्ट में आउटपुट फ़ंक्शन के लिए ऑब्जेक्ट पास कर सकता हूं, फिर उस ऑब्जेक्ट से कॉल वापस (एक कॉल के बाद ) और मेरी अपेक्षित आउटपुट के साथ तुलना कर सकता हूं।StringIO.read()StringIO.seek(0)
उदाहरण के लिए, हम कोड को इस तरह परिवर्तित करेंगे
import sys
def write_lamb(outfile_path):
with open(outfile_path, 'w') as outfile:
outfile.write("Mary had a little lamb.\n")
if __name__ == '__main__':
write_lamb(sys.argv[1])
import unittest
import tempfile
import lamb
class LambTests(unittest.TestCase):
def test_lamb_output(self):
outfile_path = tempfile.mkstemp()[1]
try:
lamb.write_lamb(outfile_path)
contents = open(tempfile_path).read()
finally:
os.remove(outfile_path)
self.assertEqual(result, "Mary had a little lamb.\n")
इस तरह से कोड करने के लिए
import sys
def write_lamb(outfile):
outfile.write("Mary had a little lamb.\n")
if __name__ == '__main__':
with open(sys.argv[1], 'w') as outfile:
write_lamb(outfile)
import unittest
from io import StringIO
import lamb
class LambTests(unittest.TestCase):
def test_lamb_output(self):
outfile = StringIO()
lamb.write_lamb(outfile)
outfile.seek(0)
content = outfile.read()
self.assertEqual(content, "Mary had a little lamb.\n")
इस दृष्टिकोण से आपके आउटपुट फ़ंक्शन को अधिक लचीला बनाने का अतिरिक्त लाभ होता है यदि, उदाहरण के लिए, आप तय करते हैं कि आप किसी फ़ाइल को लिखना नहीं चाहते हैं, लेकिन कुछ अन्य बफ़र, क्योंकि यह सभी फ़ाइल जैसी वस्तुओं को स्वीकार करेगा।
ध्यान दें कि StringIOपरीक्षण आउटपुट की सामग्री मुख्य मेमोरी में फिट हो सकती है। बहुत बड़े आउटपुट के लिए, आप एक अस्थायी फ़ाइल दृष्टिकोण (जैसे, tempfile.SpooledTemporaryFile ) का उपयोग कर सकते हैं ।
openके रूप में वर्णित इस पृष्ठ पर अन्य उत्तरों में,unittest.mock(एनरिको एम से उत्तर देखें)