编程新手如果这是一个基本问题,请道歉。 我正在创建一个功能正常的计算器,需要能够对其进行测试以确保其正常工作。到目前为止一切运行正常,但当我尝试测试我的square_root方法时,我遇到以下错误:
AssertionError:未引发ValueError
import unittest
class Calculator(object):
def square_root(self, x):
from math import sqrt
number_types = (int, float, complex, long)
try:
if isinstance(x, number_types):
return sqrt(x)
else:
raise ValueError
except:
return "nan"
class TestCalculator(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_to_see_square_root_works_ok(self):
result = self.calc.square_root(4)
self.assertEqual(2, result)
result = self.calc.square_root(0)
self.assertEqual(0, result)
result = self.calc.square_root(-4)
self.assertEqual("nan", result)
def test_calculator_returns_error_message_if_x_arg_is_not_number(self):
self.assertRaises(ValueError, self.calc.square_root, 'two')
if __name__ == '__main__':
unittest.main()
我不知道为什么它没有引发值错误,因为我已经指定了上面的数字类型。我还有其他几个计算器函数都没有错误地通过,但我无法想出这一点。任何帮助深表感谢。谢谢
答案 0 :(得分:0)
发生错误是因为您有两个可能的输入错误,这些错误是不同的但是作为同一个异常ValueError
处理。如果您运行sqrt(-4)
,则会收到ValueError
个例外。无论哪种方式,都会为输入'two'
引发异常,因为它不是数字类型。然后调用except
子句,它将返回'nan'
,覆盖异常的返回,因为Python认为你已经处理了异常。你真正拥有的是两个不同的错误:输入在平方根操作域之外的数学错误和输入不是数字类型的数据类型错误。我将使用以下代码处理它,该代码使用自定义异常和两个except
子句来区分这两种情况:
import unittest
class DataError(Exception):
pass
class Calculator(object):
def square_root(self, x):
from math import sqrt
number_types = (int, float, complex, long)
try:
if isinstance(x, number_types):
return sqrt(x)
else:
raise DataError("Not a numeric type")
except ValueError:
return "nan"
except DataError:
raise
class TestCalculator(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_to_see_square_root_works_ok(self):
self.assertEqual(2, self.calc.square_root(4))
self.assertEqual(0, self.calc.square_root(0))
self.assertEqual("nan", self.calc.square_root(-4))
def test_calculator_returns_error_message_if_x_arg_is_not_number(self):
self.assertRaises(DataError, self.calc.square_root, [self, 'two$
if __name__ == '__main__':
unittest.main()
或者,取而代之的是,假设您的用户知道不采用负数的平方根并仅处理ValueError
,因为“两个”不是数字。