Как проверить, является ли значение nan в unittest?

У меня есть функции, которые иногда возвращают NaN с помощью float('nan') (я не использую numpy).

Как мне написать тест для него, так как

assertEqual(nan_value, float('nan'))

точно так же, как float('nan') == float('nan') всегда false. Может быть, что-то вроде assertIsNan? Я ничего не мог найти об этом...

Ответ 1

Я придумал

assertTrue(math.isnan(nan_value))

Ответ 2

math.isnan(x) поднимет a TypeError, если x не является ни a float, ни a Real.

Лучше использовать что-то вроде этого:

import math


class NumericAssertions:
    """
    This class is following the UnitTest naming conventions.
    It is meant to be used along with unittest.TestCase like so :
    class MyTest(unittest.TestCase, NumericAssertions):
        ...
    It needs python >= 2.6
    """

    def assertIsNaN(self, value, msg=None):
        """
        Fail if provided value is not NaN
        """
        standardMsg = "%s is not NaN" % str(value)
        try:
            if not math.isnan(value):
                self.fail(self._formatMessage(msg, standardMsg))
        except:
            self.fail(self._formatMessage(msg, standardMsg))

    def assertIsNotNaN(self, value, msg=None):
        """
        Fail if provided value is NaN
        """
        standardMsg = "Provided value is NaN"
        try:
            if math.isnan(value):
                self.fail(self._formatMessage(msg, standardMsg))
        except:
            pass

Затем вы можете использовать self.assertIsNaN() и self.assertIsNotNaN().