2

私はpythonメソッドで次のことを行います:

  1. os.listdir(/test) を使用して、ディレクトリの下にあるファイルを一覧表示します
  2. 正規表現は、ディレクトリの下のファイルのいくつかに一致し、ファイルをリストに入れます
  3. リスト内のファイルからコンテンツを読み取り、いくつかの集計を行います。

明らかに、私のケースでテストする興味深い部分は 2 と 3 だけなので、1 は間違いなくモックしたいものです。setUp()とtearDown()で/testフォルダの下にパッチファイルの作成/削除を始めました。しかし、同僚は、I/O をまとめて行うのは得策ではないと私に言いました。

私のユニットで os.listdir() でビルドをモックする最良の方法は何ですか? または代替手段は何ですか?

次のようなことを達成するためにできることはありますか:

setUp() {
    #mock a few files eg.test1.txt, test2.txt, test3.txt under directory /test 
    #without physically creating them using I/O
}
tearDown() {
   #whatever cleanup required 
}
4

2 に答える 2

4

Mock モジュールの使用についてはどうですか?

>>> import os
>>> from mock import MagicMock
>>> os.listdir = MagicMock(return_value=['file1.txt', 'file2.txt', 'file3.txt'])
>>> os.listdir('./test')
['file1.txt', 'file2.txt', 'file3.txt']

mokey パッチ (つまり、壊れる) をしたくない場合は、mock_os などを使用できます。

開始と停止について読む:
http://docs.python.org/dev/py3k/library/unittest.mock.html#patch-methods-start-and-stop

そして:
http://docs.python.org/dev/py3k/library/unittest.mock.html#quick-guide

于 2012-05-30T17:01:59.530 に答える
4

モック モジュールは、ファイルの一覧表示とモック データの読み取りの両方に適していることがわかりました。もちろん、これらは 1 つのテストで組み合わせることができますが、わかりやすくするために作業ファイルに分けました。

import unittest
from mock import patch, mock_open
import os


class Test(unittest.TestCase):
    @patch.object(os, 'listdir')
    def test_listdir(self, mock_listdir):
        expected = ['file1.txt', 'file2.txt']
        mock_listdir.return_value = expected
        self.assertEquals(expected, Code().get_folder("~"))

    def test_file_mock(self):
        expected_string = "Some File Contents"
        mocked_file_object = mock_open(read_data=expected_string)
        with patch('__main__.open', mocked_file_object, create=True) as mocked_open:
            self.assertEquals(expected_string, Code().get_file_as_string('any'))


class Code(object):
    def get_folder(self, folder):
        return os.listdir(folder)

    def get_file_as_string(self, afile):
        with open(afile, 'r') as handle:
            return handle.read()


if __name__ == '__main__':
    unittest.main()
于 2015-01-08T15:08:21.363 に答える