wolę mieć funkcje wyjściowe wyraźnie Przyjmowanie pliku uchwyt (lub plikopodobnym obiekt), zamiast zaakceptować plik nazwa i otwierając plik sami. W ten sposób mogę przekazać obiekt StringIO
do funkcji wyjściowej w moim teście urządzenia, następnie .read()
zawartość z powrotem z tego obiektu StringIO
(po wywołaniu .seek(0)
) i porównać z moim oczekiwanym wyjściem.
Na przykład, będziemy przechodzić kod jak ten
##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")
do kodu jak ten
##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")
Podejście to ma tę dodatkową zaletę dokonywania funkcję wyjścia bardziej elastyczne, jeśli na przykład, zdecyduj, że nie chcesz pisać do pliku, ale do innego bufora, ponieważ akceptuje on wszystkie obiekty podobne do plików.
Należy pamiętać, że za pomocą StringIO
zakłada się, że zawartość wyników testu mieści się w pamięci głównej.W przypadku bardzo dużych wyników można użyć podejścia temporary file (np. tempfile.SpooledTemporaryFile).
można podać przykładowy kod do tego? To brzmi interesująco. – buhtz
Dodałem przykład dla wszystkich trzech podejść, @buhtz. –