2013-06-03 39 views
11

Tôi có các chức năng, đôi khi trả lại các NaN với float('nan') (Tôi không sử dụng numpy).Làm thế nào để kiểm tra xem giá trị có nan không nhất thiết?

Làm thế nào để viết một bài kiểm tra cho nó, vì

assertEqual(nan_value, float('nan')) 

là giống như float('nan') == float('nan') luôn sai. Có thể có cái gì đó giống như assertIsNan? Tôi không thể tìm thấy bất cứ điều gì về nó ...

+0

bản sao có thể có của [Làm thế nào để bạn kiểm tra xem liệu một đôi có bằng NaN trong Java không?] (Http://stackoverflow.com/questions/1456566/how-do-you-test-to-see-if -a-đôi-là-bằng-nan-in-java) – Raedwald

Trả lời

10

tôi đến với

assertTrue(math.isnan(nan_value)) 
7

math.isnan(x) sẽ nâng cao một TypeError nếu x không phải là một float hay một Real.

Nó tốt hơn để sử dụng một cái gì đó như thế này:

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 

Sau đó bạn có thể sử dụng self.assertIsNaN()self.assertIsNotNaN().