2016-05-30 9 views
-2

Python 3.5を使用すると、実行時に以下のすべてのテストが成功するのはなぜですか? divが呼び出されたときにExceptionが呼び出されないので、どうすればassertRaises()は文句を言わないのですか?なぜPythons unittest.assertRaises()はエラーを発生させませんか?

assertRaises()のドキュメントによれば、「例外が発生しなければ失敗する」

誰かが私を助けることができますか?あなたは間違った署名でdivと呼ばれていると例外がdiv呼び出す前に上げた(divの実際のボディが実行されなかった、例外は実行前に上げた)ので

.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.002s 




def div(self, x, y): 
    if y == 0: 
     raise Exception("Division by zero") 
    return x/y 

class MyTest(unittest.TestCase): 

    def test1(self): 
     with self.assertRaises(Exception) as cm: 
      self.div(2, 1) 

    def test2(self): 
     self.assertRaises(Exception, div, 2, 1) 
+1

のように、投げるとキャッチ 'Exception'ないでください:だ、それはまたあなたのテストで例外メッセージを確認することをお勧めしますなぜ

ここでスローされている 'TypeError' – Eric

答えて

5

divから ZeroDivisionErrorを高め、あなたのテストケース内 assertRaises(ZeroDivisionError, ...assertRaises(Exception, ...を交換しようとする上で何が起こっているかの より鮮明な画像を取得します。

+0

ありがとうございますが、divを外部に呼び出すと、「例外はユーザコードによって処理されませんでした」というエラーが表示されるのはなぜですか? – Shuzheng

+0

そのメッセージのようなサウンドは、実行中の奇妙なシェルから来ています。どちらの方法でも、あなたのコードによって処理されなかった例外がありました。メッセージは – Eric

+0

と同じです。問題を引き起こしたVisual StudioコマンドラインPythonからうまく動作して..ありがとう! – Shuzheng

2

例外あなたがself.div()を呼び出すときにMyTestクラスの外でdiv方法を定義したので、が発生します。それは間違ったものをキャッチするあまりにも簡単だから

with self.assertRaises(Exception) as exc: 
    self.div(2, 1) 
self.assertEqual("Division by zero", str(exc.exception)) 
+0

divメソッドが正しい方法で呼び出されると、「例外がユーザーコードによって処理されませんでした」(ゼロ除算)というエラーが表示されます。何故ですか? – Shuzheng

+0

https://en.wikibooks.org/wiki/Python_Programming/Exceptions#Catching_exceptions – AK47

関連する問題