auf eine frühere Frage von mir Verwandte: How to unit test a method that calculates the size of a dir? Ich möchte diese Funktion zu Unit-Test:Wie spottet man das Eingabeverzeichnis für meinen Komponententest?
def get_dir_size(dir_path):
"""Determine the size of a dir.
This function also takes into account the allocated size of
directories (4096 bytes).
Note: The function may crash on symlinks with something like:
OSError: [Errno 40] Too many levels of symbolic links
:param dir_path (str): path to the directory
:return: size in bytes.
"""
tot_size = 0
for (root_path, dirnames, filenames) in os.walk(dir_path):
for f in filenames:
fpath = os.path.join(root_path, f)
tot_size += os.path.getsize(fpath)
tot_size += os.path.getsize(root_path)
return tot_size
Also von dem, was ich verstanden habe ich die os.walk
Funktion
import threedi_utils
@mock.patch('threedi_utils.files.os.walk')
def test_get_dir_size_can_get_dir_size(self, mock_walk):
mock_walk.return_value(5000)
size = threedi_utils.files.get_dir_size(self.test_path)
self.assertEqual(size, 5000)
Aber mock_walk.return_value(5000)
geht lustig zu machen, ohne Wirkung wie mein Test nicht
Traceback (most recent call last):
File "/home/vagrant/.buildout/eggs/mock-1.3.0-py2.7.egg/mock/mock.py", line 1305, in patched
return func(*args, **keywargs)
File "/srv/lib/threedi_utils/tests/test_files.py", line 55, in test_get_dir_size_can_get_dir_size
self.assertEqual(size, 5000)
AssertionError: 0 != 5000
Was bin ich mi Ssing?
Das macht absolut keinen Sinn. Wenn du die ganze "get_dir_size" ausspionierst, ** was genau testest du?! ** Alles, was du hier testest, ist, dass dein Mock den Wert zurückgibt, den du ihm gerade gesagt hast. Wenn Sie "os.walk" ausspionieren wollen, müssen Sie das Mock zurückgeben, was diese Funktion tatsächlich tun würde, damit Sie sehen können, ob Ihre Funktion das Richtige damit macht. – jonrsharpe
Haha, ich sehe! Sie möchten Ihren Kommentar in eine Antwort umwandeln, die mich in die richtige Richtung lenken kann? – LarsVegas
Stattdessen empfehle ich Ihnen [lesen Sie die Dokumente] (https://docs.python.org/3/library/os.html#os.walk) (oder einfach * führen Sie die Funktion, die Sie verspotten *) und Schreibe einen 'return_value', der eigentlich das darstellt, was du erwartest. Das ist die Grundlage für Spott. Die Dokumentation "[unittest.mock"] (https://docs.python.org/3/library/unittest.mock.html) enthält ebenfalls viele Beispiele. – jonrsharpe