2017-03-23 10 views
1

長時間リスナー、初回呼び出し元。Python:どのように再帰的メソッドをテストできますか?

私はいくつかのfind様な機能を持っている特定のディレクトリに(scandirを使用して)再帰的なスキャンを実行のpython 2.7方法を書いている(つまり、あなたはmindepthmaxdepthを指定することができます)

def scan_tree(self, search_path, max_levels=-1, min_levels=-1, _level=0): 
    """Recursively yield DirEntry objects for given directory.""" 
    max_out = max_levels > -1 and _level == max_levels 
    min_out = min_levels > -1 and _level <= min_levels 

    for entry in scandir(search_path): 
     if entry.is_dir(follow_symlinks=False) and not max_out: 
      for child in self._scan_tree(entry.path, max_levels, 
             min_levels, _level + 1): 
       if not child.is_dir(follow_symlinks=False): 
        yield child 

     elif not min_out: 
      yield entry 

事があり、私は私の人生のために私にmockの両方に適切に再帰呼び出しscandirテスト私の最低限の動作を許可するユニットテストを書くための最良の/適切な方法を把握することはできません最大スキャンパラメータeters。

通常、私は(私はすでにそれを適切に検証可能なバージョンを書いた)スキャンを行うためにscandir.walkを使用したいが、私は本当にscandirが吐き出すDirEntryインスタンスに関する情報を必要とします。

すべてのアイデアをいただければ幸いです。ありがとう!

+0

私は、 'scandir'を基にして(' '(root、dir_entries、file_entries)のタプルを返す)' 'walk'のようなメソッドを設定して、テスト可能な状態に戻ることができました。最初は 'walk 'のために働いたものと同様の'模擬'戦略ですが、私は最初の再帰的な問題をどう扱うかを考えていきたいと思います。 ありがとう! – hoafaloaf

答えて

0

私は別の解決策提示することができます:

を周りのものを入れる

ディレクトリ構造を作成します:「私はしたいことは何ですか?」自問してみてください。私はそれがテストするための固定ディレクトリ構造を持っていると推定します。このような構造体をmakedirsなどのosパッケージ関数を使用して作成し、単にscandirと呼びますが、search_pathを固定の 'testdir':現在の作業ディレクトリのサブディレクトリに修正します。

など。

shutil.rmtree(os.path.join(basedir, '/testdirectory/')) 
:次に

basedir = os.path.dirname(__file__) 
os.makedirs(os.path.join(basedir, '/testdirectory/first/second')) 
os.makedirs(os.path.join(basedir, '/testdirectory/another/')) 
"""You can create some additional empty files and directories if you want""" 
"""(...)""" 
"""Do the rest of your work here""" 

、あなたのエラーハンドラでは、あなたの試験終了時のクリーンアップ操作として、一時ファイルを削除するには、これを呼び出すことを忘れないでください:ような何かを行います実際のディレクトリで作業することのメリットは、PythonのOSの違いや抽象度を抽象化することができることです。テストコードを実際のものに似せるように再作成する必要はありません。

この回答のコード例には例外処理がありません。これを自分で追加する必要があります。

関連する問題