Python - test a property throws exception

故事扮演 提交于 2020-07-18 03:56:50

问题


Given:

def test_to_check_exception_is_thrown(self):
    # Arrange
    c = Class()
    # Act and Assert
    self.assertRaises(NameError, c.do_something)

If do_something throws an exception the test passes.

But I have a property, and when I replace c.do_something with c.name = "Name" I get an error about my Test Module not being imported and Eclipse highlights the equals symbol.

How do I test a property throws an exception?

Edit:

setattr and getattr are new to me. They've certainly helped in this case, thanks.


回答1:


assertRaises expects a callable object. You can create a function and pass it:

obj = Class()
def setNameTest():
    obj.name = "Name"        
self.assertRaises(NameError, setNameTest)

Another possibility is to use setattr:

self.assertRaises(NameError, setattr, obj, "name", "Name")

Your original code raises a syntax error because assignment is a statement and cannot be placed inside an expression.




回答2:


Since Python 2.7 and 3.1 assertRaises() can be used as a context manager. See here for Python 2 and here for Python3.

So you can write your test with the with instruction like this:

def test_to_check_exception_is_thrown(self):
    c = Class()
    with self.assertRaises(NameError):
        c.name = "Name"



回答3:


The second argument to assertRaises should be a callable.

An assignment statement (ie. class.name = "Name") is not a callable so it will not work. Use setattr to perform the assignment like so

self.assertRaises(NameError, setattr, myclass, "name", "Name")

Also, you can't assign to class since it's a keyword.




回答4:


As @interjay stated, it is expecting a callble, but ou don't really need to define a named function for this, a lambda will do it:

self.assertRaises(SomeException, lambda: my_instance.some_property)



回答5:


You're getting an error because it's a syntax error in Python to have an assignment inside another expression. For example:

>>> print(foo = 'bar')
------------------------------------------------------------
   File "<ipython console>", line 1
     print(foo = 'bar')
               ^
SyntaxError: invalid syntax

But doing it in two steps works fine:

>>> foo = 'bar'
>>> print(foo)
bar

To test that a property throws an exception, use a try block:

try:
   object.property = 'error'
except ExpectedError:
   test_passes()
else:
   test_fails()


来源:https://stackoverflow.com/questions/2066179/python-test-a-property-throws-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!