4

それが特定の形式であるとアサートしたいresult場合、戻り値を次のように設定するとします。(True, 'Success')

def batch_move(self, *args, **kwargs):
  ''' 
  Move a batch of files to its respective destinations.
  Return type: tuple (boolean, message)
                      T/F    , 'string' / str(exception)
  '''

  srcs= kwargs.get('srcs', None)
  dests = kwargs.get('dests', None)

  try:
    if srcs and dests:
       # map srcs and dests into dictionary (srcs --> keys, dests --> values)
       src_dest= dict(zip(srcs, dests))     

       for src, dest in src_dest:
         if os.path.exists(src):
           if os.path.exists(dest):
              shutil.rmtree(dest)
           shutil.move(src, dest)   # either way we will proceed to move
         else:
           return (False, '%s does not exist!' % src)
       return (True, 'Success!')

    else:
       return (False, 'Something gone wrong with those kwargs...')
  except Exception as e:
    return (False, e)

たどり着くためにreturn (True, 'Success!')

  1. 戻り値としてパッチos.path.existsします。Trueしかし、ある単体テストではこれをスキップしたいのですが、どうすればパッチを当てることができos.path.existsますか?
    if os.path.exists(dest):  # I want to skip this
         shutil.rmtree(dest)
  1. パッチを適用するにはどうすればよいshutil.move(src, dest)ですか? Trueエラーが発生しないように与えるだけですか?失敗して例外をキャッチしたい場合はどうすればよいですか? それをシミュレートするにはどうすればよいですか?(どの例外をキャッチするべきか、私は常に知っているわけではありません。主な理由は を使用するためException as eです)。

  2. 実際に関数を渡すと、例外がキャッチされず、すべての行を通過したことを本当に意味しますか? それとも、`mock_object.return_value = (True, 'Success!')' を設定したからですか?

  3. 2 つの依存関係しか使用していません。(os、sys、math、datetime) などのすべての外部依存関係を 1 つにまとめて修正する必要がありますか? または、関数が他の関数 (リファクタリングされた) を使用している場合

 def f1(*args, **kwargs):
    f2(..)   # use math, plot, datetime
    f3(..)   # use math and datetime
    f4(..)   # use datetime

    ....

ありがとう。長い質問で申し訳ありません。私はユニットテストを書くのが本当に上手になりたいです。

4

1 に答える 1

1

この特定のユースケースでは、パッチ/モックが最良の代替手段になるとは思わない...

この単体テストでは、ファイルシステムに構造を作成し、ディスク内のその構造に対してアルゴリズムを実行し、さまざまな結果を確認します (すべて OS や Shutil をモックすることはありません)。

通常、外部セットアップが困難または遅い場合 (つまり、外部データベースをセットアップする必要がある場合)、またはテストが停止する場合 (つまり、ダイアログを開く場合)、または難しいことをしたい場合に、主にパッチ適用を使用する傾向があります。そうでない場合はチェックします (一部のキャッシュが実際にアクセスされているかどうかをカウントするなど)。

それ以外に、パッチ/モックが多すぎると、設計に問題があるという印象を受けます (これは、単体テストを念頭に置いて行われたものではありません)。そのため、小さなチャンクに分割してテストすると役立つ場合があります...

于 2012-04-27T00:23:45.173 に答える