我有一個在使用錯誤值實體化時引發例外的類,我想撰寫一個單元測驗,在給定錯誤引數時引發例外。
在 self.assertRaises() 之外實體化一個物件似乎不會導致任何錯誤,當我嘗試在斷言中實體化它時,我無法理解為什么它會導致錯誤
我的課看起來像這樣:
class Mark:
def __init__(self, a, b, c):
try:
self.a = a
self.b = int(b)
self.c = int(c)
except ValueError:
print(e)
我的測驗如下所示:
import unittest
import main
class Test(unittest.TestCase):
def test_marks(self):
self.assertRaises(ValueError, main.Mark("X", 5, 32))
self.assertRaises(ValueError, main.Mark(1, "X", 32))
self.assertRaises(ValueError, main.Mark(1, 5, "X"))
if __name__ == "__main__":
unittest.main()
但我得到:
(base) ? Code Python3 test.py
E
======================================================================
ERROR: test_marks (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Code/test.py", line 12, in test_marks
self.assertRaises(ValueError, main.Mark("X", 5, 32))
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py", line 733, in assertRaises
return context.handle('assertRaises', args, kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py", line 201, in handle
callable_obj(*args, **kwargs)
TypeError: 'Mark' object is not callable
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
如果我想測驗這個,你知道我該怎么做嗎?
uj5u.com熱心網友回復:
的簽名與assertRaises您的用法不同。請參閱此處的檔案
您應該為它提供一個可呼叫物件和它應該呼叫它的引數,或者您應該使用該with陳述句并像往常一樣呼叫它。
這是一個片段,顯示了兩種方法:
def test_marks(self):
self.assertRaises(ValueError, main.Mark, "X", 5, 32)
with self.assertRaises(ValueError):
main.Mark(1, "X", 32)
根據您編輯的問題:您實際上并沒有拋出例外,而是在代碼中捕獲它,因此斷言失敗,因為您沒有做您期望的事情。測驗有效!
現在,如果您想檢查是否按預期捕獲了例外,您應該測驗是否列印了 print 陳述句:
import contextlib
import io
import unittest
import main
class Test(unittest.TestCase):
def test_marks(self):
with contextlib.redirect_stdout(io.StringIO()) as f:
main.Mark(1, 2, 3)
output = f.getvalue().strip()
assert output == 'I am an exception'
if __name__ == "__main__":
unittest.main()
我們在這里所做的是將標準輸出重定向到一個簡單的文本流,然后呼叫您的方法,捕獲輸出(剝離它以洗掉任何未知的空格)并檢查輸出的字串是否與我們預期的相同。就我而言,我只是列印"I am an exception". 您應該將其替換為例外的輸出。
uj5u.com熱心網友回復:
assertRaises()期望一個可呼叫的而不是被呼叫的函式。
您只需提供可呼叫物件并附加引數而不使用():
self.assertRaises(ValueError, main.Mark, "X", 5, 32)
或者,您可以使用背景關系管理器:
with self.assertRaises(ValueError):
main.Mark("X", 5, 32)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/427117.html
標籤:Python 单元测试 python-unittest
