试图在python 2.7.5

时间:2015-12-09 18:39:28

标签: python unit-testing calculator

编程新手如果这是一个基本问题,请道歉。 我正在创建一个功能正常的计算器,需要能够对其进行测试以确保其正常工作。到目前为止一切运行正常,但当我尝试测试我的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()

我不知道为什么它没有引发值错误,因为我已经指定了上面的数字类型。我还有其他几个计算器函数都没有错误地通过,但我无法想出这一点。任何帮助深表感谢。谢谢

1 个答案:

答案 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,因为“两个”不是数字。