açıkça bir dosyayı kabul çıkış fonksiyonlarını olmasını tercih sap (veya dosya benzeri nesne) Bir dosya adı kabul edip dosyayı kendileri açarak yerine. Bu şekilde, bir StringIO
nesnesini, birim testimde çıkış fonksiyonuna, daha sonra içeriğine (StringIO
nesnesinden geri) (.seek(0)
çağrısından sonra) ve beklenen çıktımla karşılaştırılabilir.
Örneğin, bu
##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")
Bu yaklaşım gibi kodlamak için bu
##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")
gibi kod geçiş olur mesela eğer daha esnek çıktı fonksiyonunu yapma yararı vardır, sen Bir dosyaya yazmak istemediğinize karar verebilirsiniz, ancak başka bir tampon, tüm dosya benzeri nesneleri kabul edeceğinden.
StringIO
kullanarak, test çıktısının içeriğinin ana belleğe sığabileceğini varsayar.Çok büyük çıktılar için, temporary file yaklaşımını kullanabilirsiniz (ör. tempfile.SpooledTemporaryFile).
bunun için örnek kod verebilir misiniz? Kulağa ilginç geliyor. – buhtz
Üç yaklaşımın tümü için bir @buhtz örneği ekledim. –