这是Loan Calculator
Loan amount: 1000
Interest rate: 9
Number of payments: 100
('Monthly payment: ', 9000.0)
。我有一个名为Python 2.7
的类,有些属性我想在用户设置时抛出异常:
class A
我想写一个myA = A()
myA.myattribute = 9 # this should throw an error
来确保这会引发错误。
创建测试类并继承unittest
后,我尝试编写这样的测试:
unittest.TestCase
但是,这会引发myA = A()
self.assertRaises(AttributeError, eval('myA.myattribute = 9'))
。但是,如果我尝试syntax error
,它会抛出属性错误。
如何编写单元测试来正确测试?
感谢。
答案 0 :(得分:5)
您还可以使用assertRaises
作为上下文管理器:
with self.assertRaises(AttributeError):
myA.myattribute = 9
documentation shows more examples for this if you are interested。 assertRaises的文档也有关于此主题的更多详细信息。
从该文件:
如果只给出了异常和可能的msg参数,则返回一个上下文管理器,以便可以编写测试中的代码 内联而不是功能:
with self.assertRaises(SomeException): do_something()
这正是你想要做的。
答案 1 :(得分:2)
self.assertRaises
将可调用的(以及可选的一个或多个可调用的参数)作为其参数;您提供的是通过调用callable及其参数产生的值。正确的测试是 self.assertRaises(AttributeError, eval, 'myA.myattribute = 9')
# Thanks to @mgilson for something that actually works while
# resembling the original attempt.
self.assertRaises(AttributeError, eval, 'myA.myattribute = 9', locals())
但是,您应该使用assertRaises
作为上下文管理器,这样您就可以编写更自然的
with self.assertRaises(AttributeError):
myA.myattribute = 9