मैं स्पष्ट रूप से एक फ़ाइल को स्वीकार उत्पादन कार्यों को पसंद संभाल (या फ़ाइल की तरह वस्तु), बजाय एक फ़ाइल नाम स्वीकार करते हैं और फ़ाइल के लिए खुद को खोलने। इस तरह, मैं StringIO
ऑब्जेक्ट को अपने यूनिट टेस्ट में आउटपुट फ़ंक्शन पर पास कर सकता हूं, फिर .read()
उस StringIO
ऑब्जेक्ट से पहले की सामग्री (.seek(0)
कॉल के बाद) और मेरे अपेक्षित आउटपुट की तुलना करें।
उदाहरण के लिए, हम कोड इस
##File:lamb.py
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])
##File test_lamb.py
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:
# NOTE: To retain the tempfile if the test fails, remove
# the try-finally clauses
os.remove(outfile_path)
self.assertEqual(result, "Mary had a little lamb.\n")
की तरह इस
##File:lamb.py
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)
##File test_lamb.py
import unittest
from io import StringIO
import lamb
class LambTests(unittest.TestCase):
def test_lamb_output(self):
outfile = StringIO()
# NOTE: Alternatively, for Python 2.6+, you can use
# tempfile.SpooledTemporaryFile, e.g.,
#outfile = tempfile.SpooledTemporaryFile(10 ** 9)
lamb.write_lamb(outfile)
outfile.seek(0)
content = outfile.read()
self.assertEqual(content, "Mary had a little lamb.\n")
यह दृष्टिकोण की तरह कोड के लिए संक्रमण होगा उदाहरण के लिए और अधिक लचीला है, तो अपने उत्पादन समारोह बनाने, के अतिरिक्त लाभ है, तो आप तय करें कि आप किसी फ़ाइल को लिखना नहीं चाहते हैं, लेकिन कुछ अन्य बफर, क्योंकि यह सभी फाइल-जैसी ऑब्जेक्ट्स स्वीकार करेगा।
ध्यान दें कि StringIO
का उपयोग करके परीक्षण आउटपुट की सामग्री मुख्य स्मृति में फिट हो सकती है।बहुत बड़े आउटपुट के लिए, आप temporary file दृष्टिकोण (उदा।, tempfile.SpooledTemporaryFile) का उपयोग कर सकते हैं।
आपको लगता है कि के लिए उदाहरण कोड प्रदान कर सकता है? यह दिलचस्प लगता है। – buhtz
मैंने सभी तीन दृष्टिकोणों के लिए एक उदाहरण जोड़ा, @buhtz। –