python – attributeError(“’_ AssertRaisesContext’对象没有
发布时间:2020-12-20 11:58:08 所属栏目:Python 来源:网络整理
导读:我是 python的初学者.我真的不明白这个错误是指什么.任何帮助将不胜感激. 该代码应该计算某个国家/地区的人们的税收如下: 每年收入:0 – 1000 税率:0% 年收入:1,001 – 10,000 税率:10% 每年收入:10,001 – 20,200 税率:15% 年收入:20,201 – 30,
我是
python的初学者.我真的不明白这个错误是指什么.任何帮助将不胜感激.
该代码应该计算某个国家/地区的人们的税收如下: 每年收入:0 – 1000 税率:0% 年收入:1,001 – 10,000 税率:10% 每年收入:10,001 – 20,200 税率:15% 年收入:20,201 – 30,750 税率:20% 年收入:30,751 – 50,000 税率: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,{"James": 20500,"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') 请帮忙:-) 解决方法
作为参考,失败测试的完整异常消息如下:
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.","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.","Invalid input of type int not allowed" ) 如果通过对calculate_tax的调用引发异常,则with self.assertRaises(…)语句可以捕获异常.如果发生这种情况,则异常细节将保留在上下文中,然后您的断言将能够测试异常是否符合您的预期. 但是,即使进行此更改,测试仍然失败,因为calculate_tax(1)不会引发ValueError.我会让你解决这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |