【问题标题】:Error in test exception测试异常中的错误
【发布时间】:2017-07-17 10:42:00
【问题描述】:

这是我要测试的虚拟类:

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: 'tuple' object is not callable” 我知道这个错误与 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

【问题讨论】:

  • 你能给我们看看万用表吗?
  • 对不起,我在复制时打错了,我更正了文字
  • 真正的问题是什么?该函数正在捕获异常,因此测试未接收到它是可以的。

标签: python python-unittest stub


【解决方案1】:

必须改用 pytest.raises。请参阅docs

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

似乎测试也会失败,因为方法正在捕获异常,而不是引发异常。

【讨论】:

  • 感谢您的回答。我用它,但它给出了同样的问题
  • 如果输出为:AssertionError: IOError not raised,仅表示该函数没有引发异常,这真的没问题,因为问题中发布的代码没有引发这些异常,它实际上是在捕获它们,所以它不会被扔到测试中。
  • 如果解决了问题,请将答案标记为有效:)
【解决方案2】:

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

我解决了问题

【讨论】:

  • 这是在测试其他东西,如果你在 IOError 异常之后,那么这意味着它正在测试其他东西。也许澄清问题中的问题。
  • 你说得对,我今天一直在查看代码。有两个错误:我不应该在 Meter 类中打印消息,而是提高它。和 self.assertRaises(Exception, m.readSignal('b1')) 应该是: self.assertRaises(IOError, m.readSignal, 'b1')
猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多