Подтвердить что ты не робот

Как написать тест django, чтобы потерпеть неудачу?

У меня есть модель под названием Thing с атрибутом, называемым name, и я хочу, чтобы имя было char, длиной всего 3 символа.

Как мне написать тест для этого?

class TestCase1(TestCase):
    def test1(self):
        thing = Thing(name='1234')

этот тест должен завершиться неудачно. Как правильно написать тест, чтобы тест прошел, когда этот объект вышел из строя?

4b9b3361

Ответ 1

Если вы ожидаете, что Thing (name= '1234') поднимет исключение, есть два способа справиться с этим.

Один из них - использование аргументов Django assertRaises (на самом деле из unittest/unittest2):

def mytest(self):
    self.assertRaises(FooException, Thing, name='1234')

Это не удается, если Thing (name= '1234') вызывает ошибку FooException. Другой способ - поймать ожидаемое исключение и поднять его, если этого не произойдет, например:

def mytest(self):
    try:
        thing = Thing(name='1234')
        self.fail("your message here")
    except FooException:
        pass

Очевидно, замените FooException тем, который вы ожидаете получить от создания объекта со слишком длинной строкой. ValidationError?

Третий вариант (с Python 2.7) заключается в том, чтобы использовать assertRaises в качестве менеджера контекста, что делает более понятным и понятным код:

def mytest(self):
    with self.assertRaises(FooException):
        thing = Thing(name='1234')

К сожалению, это не позволяет создавать собственные сообщения об ошибках тестирования, поэтому хорошо документируйте ваши тесты. Подробнее см. https://hg.python.org/cpython/file/2.7/Lib/unittest/case.py#l97.

Ответ 2

Что-то вроде этого должно работать:

thing = Thing.objects.create(name='1234')  
# not sure if you need here .get() or if. create() truncates the field on its own
self.assertEqual(thing.name, '123') # or: self.assertEqual(len(thing.name), 3)

- но такой тест выглядит странно: -)

Также обратите внимание, что база данных MySQLdb будет вызывать предупреждение Warning, чтобы уведомить вас об усечении строки, поэтому вы можете проверить ее с помощью assertRaises.