19

これがコードだとしましょう

def move(*args, **kwargs):   
    try:
        shutil.move(source, destination)
    except Exception as e:
        raise e

そして私のtests.pyで

@patch.object(shutil, 'move')
def test_move_catch_exception(self, mock_rmtree):
    ''' Tests moving a target hits exception. '''
    mock_rmtree.side_effect = Exception('abc')
    self.assertRaises(Exception, move,
                             self.src_f, self.src_f, **self.kwargs)

これは言った

  File "unittests.py", line 84, in test_move_catch_exception
    self.src_f, self.src_f, **self.kwargs)
AssertionError: Exception not raised

私が主張すればmock_rmtreeそれは通過するでしょう。呼び出し元(この場合は関数)でどのようにアサートできmoveますか?


aquavitaeが指摘したように、主な理由はコピーアンドペーストエラーであり、最初はタプルを主張していました常に正しいリターンタイプで評価してください...

4

1 に答える 1

27

例にタイプミスがあり、'.

あなたが何を求めているのか完全に明確ではありませんが、私があなたを正しく理解していれば、発生した例外が内部でキャッチされていることをテストする方法を尋ねていますmoveshutil.rmtree1 つの問題は、 ではなくにパッチを適用していることですがshutil.move、 がshutil.rmtree呼び出されるかどうかはわかりません。 ディレクトリのコピーに成功した場合にshutil.moveのみ実際に呼び出されますが、それ自体にコピーしているため、これは発生しません。ただし、これはパッチを適用するためのあまり良い方法ではありません。まったく呼び出されるという仮定は保証されておらず、実装に依存しているためです。shutil.rmtreeself.src_fshutil.moveshutil.rmtree

テスト方法については、戻り値が期待どおりであることを確認するだけです。

@patch.object(shutil, 'move')
def test_move_catch_exception(self, mock_move):
    ''' Tests moving a target hits exception. '''
    e = OSError('abc')
    mock_move.side_effect = e
    returns = move(self.src_f, self.src_f, **self.kwargs)
    assert returns == (False, e)
于 2012-04-25T06:37:23.240 に答える