尝试创建一个测试来测试我在 python 2.7.5 中的 square_root 方法

Trying to create a test to test my square_root method in python 2.7.5

编程新手,如果这是一个基本问题,我们深表歉意。 我正在创建一个功能正常的计算器,需要能够对其进行测试以确保其正常工作。到目前为止,一切正常 运行,但是当我尝试测试我的 square_root 方法时,我遇到了以下错误:

A​​ssertionError:未引发 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()

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

发生错误是因为您有两个可能的输入错误,它们是不同的但作为相同的异常处理,ValueError。如果你 运行 sqrt(-4),你会得到一个 ValueError 异常。无论哪种方式,都会为输入 'two' 引发异常,因为它不是数字类型。然后调用 except 子句,它将 return 'nan' 覆盖异常的 return,因为 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,因为 'two' 不是数字。