私は(comicfile.py
で)このようになりますPythonでの方法があります:私は(私はすでにprune_dirs
をテストしてみた)、このためのユニットテストを書くことをしようとしている、そしてそのために、これは何であるクラスの関数の戻り値をモックするにはどうすればよいですか?
from zipfile import ZipFile
...
class ComicFile():
...
def page_count(self):
"""Return the number of pages in the file."""
if self.file == None:
raise ComicFile.FileNoneError()
if not os.path.isfile(self.file):
raise ComicFile.FileNotFoundError()
with ZipFile(self.file) as zip:
members = zip.namelist()
pruned = self.prune_dirs(members)
length = len(pruned)
return length
を私は(test_comicfile.py
)持っている:私はこのテストを実行すると
import unittest
import unittest.mock
import comicfile
...
class TestPageCount(unittest.TestCase):
def setUp(self):
self.comic_file = comicfile.ComicFile()
@unittest.mock.patch('comicfile.ZipFile')
def test_page_count(self, mock_zip_file):
# Store as tuples to use as dictionary keys.
members_dict = {('dir/', 'dir/file1', 'dir/file2'):2,
('file1.jpg', 'file2.jpg', 'file3.jpg'):3
}
# Make the file point to something to prevent FileNoneError.
self.comic_file.file = __file__
for file_tuple, count in members_dict.items():
mock_zip_file.return_value.namelist = list(file_tuple)
self.assertEqual(count, self.comic_file.page_count())
、私は次の取得:
F..ss....
======================================================================
FAIL: test_page_count (test_comicfile.TestPageCount)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/mock.py", line 1157, in patched
return func(*args, **keywargs)
File "/Users/chuck/Dropbox/Projects/chiv/chiv.cbstar/test_comicfile.py", line 86, in test_page_count
self.assertEqual(count, self.comic_file.page_count())
AssertionError: 2 != 0
----------------------------------------------------------------------
Ran 9 tests in 0.010s
FAILED (failures=1, skipped=2)
OK、そうself.comic_file.page_count()
は0
を返します。私はmembers = zip.namelist()
の後に次の行をpage_count
に置こうとしました。テスト中
print('\nmembers -> ' + str(members))
、私はこれを取得:
members -> <MagicMock name='ZipFile().__enter__().namelist()' id='4483358280'>
私はユニットテストに非常に新たなんだとunittest.mock
を使用して、非常に漠然としていますが、私の理解がようmock_zip-file.return_value.namelist = list(file_tuple)
がそれを作っているということですZipFile
クラスのnamelist
メソッドは、file_tuple
の各コンテンツを順番に返します。それははです私は分かりません。
私がここでやろうとしていることははっきりしていると思いますが、私のユニットテストではZipFile
を処理する代わりにこの1つの機能しかテストしないように、namelist
メソッドをオーバーライドする方法を見つけられないようです。同じように。
コードが混乱します。 'ComicFile'と 'comicfile'は1クラス(スペルミス)または2ですか?最初のスニペットで 'Zipfile'を 'self.Zipfile'で行う必要がありますか?細部を知らずに、私はあなたがモックを必要とするかどうか疑問に思います。それぞれのテストは、他のすべてが動作することを前提とする必要がありあなたは、テストが失敗したときにそれだけを質問します。何かを模擬する肯定的な理由が必要です。たとえば、 '呼び出しはテスト設定で失敗するか、'実際のオブジェクトを呼び出すには時間と空間があまりにも多くかかります。 'または'戻り値が確定的ではありません '。 –
私はそれらに準拠しようとしていますが、私はPython以外の命名規則を使用している可能性があります。 'ComicFile'はクラス、' comicfile'はクラスを含むモジュールです。 'ZipFile'は' from zipfile import ZipeFile'を介してインポートされます。私は思う*私は私が実際にファイルシステムにzipファイルを持っている必要があり、私はちょうどそれをテストしたい、私はしない場合、私はモックする必要があると思う* zipファイルオブジェクトが返す場合、この関数はファイルの数を正しく数えます。 – Chuck
モックは混乱しています。特に、コンテキストマネージャに関しては混乱します。 – dm03514