skaz skaz - 18 days ago 10
Python Question

Django/Python assertRaises with message check

I am relatively new to Python and want to use a

assertRaises
test to check for a
ValidationError
, which works ok. However, I have many
ValidationError
s and I want to make sure the right one is returned. I figured I could pass something into
assertRaises
but it doesn't look like I can, so I figured I would just do an
assertTrue
and check the exception message. However, I don't know how to access it. Is this even a good way to approach this issue? thanks.

class DailyEntriesTests(TestCase):
def test_cant_have_ip_and_user(self):
u = createUser(False)
de = createDailyEntry(u, "1.1.1.1", 1)
with self.assertRaises(ValidationError) as cm:
de.full_clean()

# this line bombs - message doesn't exist. I also tried "error_code" like I saw in the documentation, but that doesn't work
print(cm.exception.message)

self.assertTrue(cm.exception.message.contains("Both"))

Answer

You can just use assertRaisesRegexp.

with self.assertRaisesRegexp(ValidationError, "Both"):
    de.full_clean()

When you use it as a context manager the 2nd argument is a regular expression to search through the exception's string representation.