2017-07-17 90 views
0

這是我的僞類,我想測試:錯誤測試異常

class Meter: 

    def __init__(self, meterInfo): 
     self.b1pos = meterInfo['b1pos'] 


    def setMeter(self): 
     print 'Initializing' 
     try: 
      print 'Connecting' 
     except IOError as message: 
      print message 

    def readSignal(self, ele_name): 
     try: 
      if ele_name in ("b1", "b2"): 
       readValue = 0.0 
       readValue1 = 0.0 
       return readValue, readValue1 
      else: 
       readValue = 0.0 
       readValue1 = 0.0 
       return readValue, readValue1 
     except IOError as message: 
      print message 

這是我的單元測試:

class TestMeter(unittest.TestCase): 

    def testSetMeter(self): 
     m = meter.Meter({'b1pos': 'b1pos'}) 
     self.assertRaises(IOError, m.setMeter()) 

    def testReadSignal(self): 
     m = meter.Meter({'b1pos': 'b1pos'}) 
     a, b = m.readSignal('b1') 
     self.assertTrue(isinstance(a, numbers.Number)) 
     self.assertTrue(isinstance(b, numbers.Number)) 
     self.assertRaises(IOError, m.readSignal('b1')) 

    if __name__ == '__main__': 
     unittest.main() 

對於testSetMeter()我沒有任何問題,但對於testReadSignal()它給了我:「TypeError:'元組'對象不可調用」 我明白這個錯誤與radSignal的返回有關,但我該如何解決它? 我試着用:

def testReadSignal(self): 
    m = meter.Meter({'b1pos': 'b1pos'}) 
    a, b = m.readSignal('b1') 
    self.assertTrue(isinstance(a, numbers.Number)) 
    self.assertTrue(isinstance(b, numbers.Number)) 
    with self.assertRaises(IOError): 
     m.readSignal('b1') 

但是,這是輸出:

AssertionError: IOError not raised 
+0

你能告訴我們班萬用表? –

+0

對不起,我在複印時輸入錯字,我改正了文字 – Joe

+0

真正的問題是什麼?該函數捕捉異常,所以測試無法接收它。 – Efren

回答

0

self.assertRaises(Exception, m.readSignal('b1')) 

我解決了這個問題

+0

這是測試其他東西,如果你是在IOError異常之後,那麼它意味着它正在測試其他東西。也許澄清問題中的問題。 – Efren

+1

你是對的,我今天一直在審查代碼。有兩個錯誤:我不應該打印類Meter中的消息,而是提高它。和 self.assertRaises(Exception,m.readSignal('b1'))應該是: self.assertRaises(IOError,m.readSignal,'b1') – Joe

0

不得不使用pytest.raises代替。請參閱docs

with self.raises(IOError): 
    m.readSignal('b1') 

它似乎也測試會失敗,因爲方法捕捉異常,而不是提高它們。

+0

謝謝你的回答。我使用它,但它給出了同樣的問題 – Joe

+1

如果輸出是:'AssertionError:IOError not raised',它只意味着該函數沒有引發異常,這確實沒問題,因爲發佈在代碼中的代碼沒有提升那些,它實際上捕捉它們,所以它不會被扔到測試中。 – Efren

+0

如果它解決了問題,請標記爲有效:) – Efren