Ope*_*lex 10 python unit-testing keyerror
我正在尝试编写一个单元测试,用于验证KeyError在将错误的密钥传递给字典时创建的单元测试.
引发异常的代码:
connections = SettingsManager().get_connections()
try:
connection = connections[self.conn_name]
except Exception:
self.log.error("Connection %s does not exist, exiting." % conn_name)
self.log.error(sys.exc_info()[0])
raise
Run Code Online (Sandbox Code Playgroud)
我看过并发现KeyError使用lambda的测试,但我没有太多运气.这是我到目前为止的测试,但它与实际的错误KeyError.
def test_bad_connection(self):
#Testing to see if a non existant connection will fail gracefully.
records = [1, 2]
given_result = DataConnector("BadConnection").generate_data(self.table, records)
expected_result = "BadConnection"
self.assertRaises(KeyError, given_result[:1])
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 10
assertRaises()将为您调用该函数,并断言该调用引发异常:
records = [1, 2]
connector = DataConnector("BadConnection")
self.assertRaises(KeyError, connector.generate_data, self.table, records)
Run Code Online (Sandbox Code Playgroud)
或者,assertRaises()用作上下文管理器:
with self.assertRaises(KeyError) as raises:
DataConnector("BadConnection").generate_data(self.table, records)
Run Code Online (Sandbox Code Playgroud)
这有一个额外的好处,然后上下文管理器允许您访问引发的异常:
self.assertEqual(raises.exception.message, "BadConnection")
Run Code Online (Sandbox Code Playgroud)
self.assertRaise() 只需要一个可调用的,所以同时
self.assertRaises(KeyError, given_result[:1])
会给你一个实际的KeyError测试,
self.assertRaises(KeyError, lambda: given_result[:1])
应该管用.
一般来说:
不起作用: self.assertRaises(KeyError, mydict[mykey]) 测试中的#KeyError
工作: self.assertRaises(KeyError, lambda: mydict[mykey])
是否有效: self.assertRaises(KeyError, mydict.__getitem__, mykey) #but需要一个实际的dict,而不是一个函数