开发者

Python - test a property throws exception

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 e开发者_如何学Pythonxception?

Edit:

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


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.


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"


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.


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

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


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()
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜