2013-09-05 4 views
1

у меня есть модуль InvalidObj«issubclass() аргумент 2 должен быть классом или кортеж» в assertRaises

class InvalidObj(Exception): 

    def__init__(self, value): 
     self.value = value 

    def __str__(self): 
     return repr(self.value) 

class Hello(object): 

    def __init__(self): 
     self.a = 10 
     self.b = 20 

    def aequalb(self): 
     if self.a != self.b: 
      raise InvalidObj("This is an error") 

Я пытаюсь сделать UnitTest где функция бросает исключение InvalidObj

class test_obj(unittest.TestCase): 

    def test_obj(self): 
     at = Hello() 
     self.assertRaises(InvalidObj("This is an error"), a.aequalb) 

При запуске вышеуказанного класса test_obj он дает мне ошибку «issubclass() arg 2 должен быть классом или кортежем». Но если я изменю линию на,

self.assertRaises(InvalidObj, at.aequalb) 

Это нормально работает. Разве ошибка не должна возвращать сообщение, переданное ему, когда оно поднято?

ответ

2

Нет, он не должен работать так, как вы ожидали. Первый аргумент - это класс (или кортеж), второй - вызываемый, остальные - как описано in the documentation.

Хотя исключение принимает аргументы, unittest не дает вам глубоких сравнений между исключениями (в противном случае было бы довольно сложно сказать, что два отдельных экземпляра одного и того же класса эквивалентны).

Чтобы решить проблему, просто тест атрибут отдельно:

with self.assertRaises(InvalidObj) as cm: 
    at.aequalb() 

self.assertEqual("This is an error", cm.exception.value) 

Примечания: Выше я использовал assertRaises() метод как менеджер контекста. Это ведет себя так, когда дается только один аргумент. Для получения дополнительной информации, пожалуйста, посетите mentioned documentation.

+0

Это прекрасно работает. Благодаря! – Nitin

Смежные вопросы