2012-04-25 8 views
18

これはコードMocking - 発信者の例外を発生させるにはどうすればよいですか?

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) 

であると仮定それは私がmock_rmtreeに主張するならば、それは通過します。この

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

を言いました。呼び出し元(この場合は関数move)でどのようにアサートできますか?が指摘


aquavitae として、主な理由は、コピー&ペーストの誤りだった、とも私は初めにタプルを主張しました。正しい戻り値のタイプで常にアシストしてください...

答えて

26

あなたの例では、入力した文字が'ではありません。

あなたが尋ねていることは完全にはっきりしませんが、正しく理解すれば、発生した例外がmoveの中に見つかったことをテストする方法を尋ねています。 1つの問題はshutil.rmtreeではなく、shutil.moveではなく、shutil.rmtreeが呼び出されることが確実であるということです。 shutil.moveは実際にディレクトリをコピーすると実際にshutil.rmtreeを呼び出しますが、self.src_fをそれ自身にコピーしているため、これは起こりません。 shutil.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) 
+2

はありがとうございました。私は混乱のために謝罪した。それは私が捕まえなかったコピーペーストエラーでした。はい、私はrmtreeではなくむしろ動いています。私はそれに応じて投稿を編集した。あなたはここで私の不注意について正しいです。どうもありがとう。 – CppLearner