2017-02-24 85 views
2

我是一個初學者在Python編碼。我真的不明白這個錯誤是指什麼。任何幫助將不勝感激。 的代碼應該計算在某一個國家的人民的稅款如下: 年收入:0 - 1000attributeError(「'_ AssertRaisesContext'對象沒有屬性'異常'」,),

稅率:0%

年收入:1001 - 10,000

稅率:10%

年收入:10,001 - 20200

稅率:15%

年收入:20,201 - 30,750

稅率:20%

年收入:30751 - 50000

稅率:25%

年收入:超過50,000

稅率:30%

我的代碼:

def calculate_tax(pDict): 
    if type(pDict) is dict: 
    try: 
     length = len(pDict) 
     count = 0 
     #decleration of new updated dictionary 
     dict_list = {} 
     while count<length: 
     #calculate yearly tax 
     #countdown of values in the dictionary until the last value 
     totals = list(pDict.values())[count] 
     totals = int(totals) 
     names = list(pDict.keys())[count] 
     #decleration of variable to store tax 
     tTax = 0 
     if totals < 1000: 
      tTax = totals * 0 
     elif totals > 1000 and totals<= 10000: 
      tTax = 1000 * 0 
      totals = totals - 1000 
      tTax = tTax + totals * 0.1 
     elif totals > 10000 and totals <=20200: 
      tTax = 1000 * 0 
      tTax = tTax + 9000 * 0.1 
      totals=totals-10000 
      tTax = tTax + totals * 0.15 
     elif totals >20200 and totals <= 30750: 
      tTax = 1000 * 0 
      tTax = tTax + 9000 * 0.1 
      tTax = tTax + 10200 * 0.15 
      totals=totals-20200 
      tTax = tTax + totals * 0.2 
     elif totals>30750 and totals<=50000: 
      tTax = 1000 * 0 
      tTax = tTax + 9000 * 0.1 
      tTax = tTax + 10200 * 0.15 
      tTax = tTax + 10550 * 0.2 
      totals=totals-30750 
      tTax = tTax + totals * 0.25 
     else: 
      tTax = 1000 * 0 
      tTax = tTax + 9000 * 0.1 
      tTax = tTax + 10200 * 0.15 
      tTax = tTax + 10550 * 0.2 
      tTax = tTax + 19250 * 0.25 
      totals=totals-50000 
      tTax = tTax + totals * 0.3 
     dict_list.setdefault(names,tTax) 
     count = count + 1 
     return dict_list 
    except(attributeError,TypeError): 
     raise ValueError('The provided input is not a dictionary') 
    else: 
    print("only dict type values allowed") 

用於測試是否我的代碼工作代碼:

from unittest import TestCase 

    class CalculateTaxTests(TestCase): 
     def test_it_calculates_tax_for_one_person(self): 
     result = calculate_tax({"James": 20500}) 
     self.assertEqual(result, {"James": 2490.0}, msg="Should return {'James': 2490.0} for the input {'James': 20500}") 

     def test_it_calculates_tax_for_several_people(self): 
     income_input = {"James": 20500, "Mary": 500, "Evan": 70000} 
     result = calculate_tax(income_input) 
     self.assertEqual({"James": 2490.0, "Mary": 0, "Evan": 15352.5}, result, 
      msg="Should return {} for the input {}".format(
       {"James": 2490.0, "Mary": 0, "Evan": 15352.5}, 
       {"James": 20500, "Mary": 500, "Evan": 70000} 
     ) 
     ) 

     def test_it_does_not_accept_integers(self): 
     with self.assertRaises(ValueError) as context: 
      calculate_tax(1) 
      self.assertEqual(
      "The provided input is not a dictionary.", 
      context.exception.message, "Invalid input of type int not allowed" 
     ) 

     def test_calculated_tax_is_a_float(self): 
     result = calculate_tax({"Jane": 20500}) 
     self.assertIsInstance(
      calculate_tax({"Jane": 20500}), dict, msg="Should return a result of data type dict") 
     self.assertIsInstance(result["Jane"], float, msg="Tax returned should be an float.") 

     def test_it_returns_zero_tax_for_income_less_than_1000(self): 
     result = calculate_tax({"Jake": 100}) 
     self.assertEqual(result, {"Jake": 0}, msg="Should return zero tax for incomes less than 1000") 

     def test_it_throws_an_error_if_any_of_the_inputs_is_non_numeric(self): 
     with self.assertRaises(ValueError, msg='Allow only numeric input'): 
      calculate_tax({"James": 2490.0, "Kiura": '200', "Kinuthia": 15352.5}) 

     def test_it_return_an_empty_dict_for_an_empty_dict_input(self): 
     result = calculate_tax({}) 
     self.assertEqual(result, {}, msg='Should return an empty dict if the input was an empty dict') 

請幫忙:-)

回答

6

作爲參考,從失敗測試完整的異常信息如下:

ERROR: test_it_does_not_accept_integers (__main__.CalculateTaxTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "calculate_tax_test.py", line 27, in test_it_does_not_accept_integers 
    context.exception.message, "Invalid input of type int not allowed" 
AttributeError: '_AssertRaisesContext' object has no attribute 'exception' 

失敗的測試是這樣的:

 def test_it_does_not_accept_integers(self): 
     with self.assertRaises(ValueError) as context: 
      calculate_tax(1) 
      self.assertEqual(
      "The provided input is not a dictionary.", 
      context.exception.message, "Invalid input of type int not allowed" 
     ) 

問題在於calculate_tax之後的斷言處於錯誤的地方。如果在calculate_tax中發生異常,則斷言將被跳過。如果沒有發生異常,斷言將失敗。因此斷言永遠不會通過。

解決方法是取消聲明以將其從with語句中移出。爲了清楚起見,我還插入一個空白行:

 def test_it_does_not_accept_integers(self): 
     with self.assertRaises(ValueError) as context: 
      calculate_tax(1) 

     self.assertEqual(
      "The provided input is not a dictionary.", 
      context.exception.message, "Invalid input of type int not allowed" 
     ) 

with self.assertRaises(...)語句可以捕捉異常,如果一個得到由調用到calculate_tax。如果發生這種情況,則異常詳細信息將保留在context中,然後您的斷言將能夠測試異常是否如您期望的那樣。

但是,即使進行此更改後,測試仍然失敗,因爲calculate_tax(1)不會引發ValueError。我會留給你解決這個問題。

+0

非常感謝! –

相關問題