2017-04-14 8 views
1

私は本当にこのエラーが例外について何かをアサートしようとしましたが、AttributeErrorを取得しましたか?

AttributeError("'_AssertRaisesContext' object has no attribute 'exception'",). 

私は2つの引数、aとbのを受け入れる機能のパワーを書き込むしようとしているを参照し、電力Bに上げ計算を理解し、TypeErrorでは発生しません。入力がintまたはfloat以外のものであればメッセージArgument must be integer or float

これは私のコードです:

def power(a, b): 
    try : 

     if b == 0: 
     return 1 
     elif b == 1: 
     return a; 
     else: 
     return a*pow(a, b-1) 

    except TypeError : 
     print ('Argument must be integer or float') 

、これはそれをテストするために使用してコードイムです:

from unittest import TestCase 
class PowerTestCases(TestCase): 
    def test_returns_correct_power(self): 
    base, exp = 2, 3 
    res = power(base, exp) 
    self.assertEqual(res, 8, msg='Expected {}, got {}'.format(8, res)) 

    def test_return_1_when_exp_is_0(self): 
    base, exp = 4, 0 
    res = power(base, exp) 
    self.assertEqual(res, 1, msg='A number power 0 should be 1') 

    def test_return_0_when_base_is_0(self): 
    base, exp = 0, 10 
    res = power(base, exp) 
    self.assertEqual(res, 0, msg='O power any number should be 0') 

    def test_non_digit_argument(self): 
    with self.assertRaises(TypeError) as context: 
     base, exp = 'base', 'exp' 
     res = power(base, exp) 
     self.assertEqual(
     'Argument must be interfer or float', 
     context.exception.message, 
     'Only digits are allowed as input' 
    ) 
+3

[Pythonのunittest.TestCase.assertRaisesが機能していない]の可能性のある重複(http://stackoverflow.com/質問/ 39450098/python-unittest-testcase-assertraises-not-working) –

+0

関数は例外を発生させません。不正な型が渡された場合、単に文字列を標準出力に出力し、 'None'を返します。詳細については、複製を参照してください。 –

答えて

2

あなたは二つの問題います、あなたはすべての

ファーストをしています実際に例外を発生させないでくださいprint()ファイル(通常は端末やコンソールに接続されている)にデータを書き込むと、それは同じことではありません。

使用raise

raise TypeError('Argument must be integer or float') 

次に、あなたは間違ったインデントレベルでアサーションを入れています。 with assertRaises()コンテキストマネージャのポイントは、ブロックwithのコードが発生するという例外をキャッチすることです。そのブロック内のそれ以降のコードは実行されません。例外はブロックを終了しました。

ブロックの後にブロックの後にアサーションを行う必要があります。そのように例外が実際に提起しなかった場合assertRaisesにも通知して、より意味のあるアサーションエラーを取得:

with self.assertRaises(TypeError) as context: 
    base, exp = 'base', 'exp' 
    res = power(base, exp) 

self.assertEqual(
    'Argument must be interfer or float', 
    context.exception.message, 
    'Only digits are allowed as input' 
) 
関連する問題