Могу ли я подделывать/издеваться над типом моих макетных объектов в python unittests

В моем коде на Python я проверяю тип одного из параметров, чтобы убедиться, что он относится к типу, который я ожидаю. Например:

def myfunction(dbConnection):
    if (type(dbConnection)<>bpgsql.Connection):
        r['error'] += ' invalid database connection'

Я хочу передать фиктивное соединение для тестирования. Есть ли способ заставить макет объекта притворяться правильным?

Ответы

Ответ 1

При всем уважении, похоже, вы, ребята, не совсем правы!

Я могу использовать утку, как сказано, но есть способ сделать то, что я намеревался сделать в первую очередь:

от http://docs.python.org/dev/library/unittest.mock.html

Поддельные объекты, которые используют класс или экземпляр в качестве spec или spec_set, могут пройти тесты isintance:

>>>
>>> mock = Mock(spec=SomeClass)
>>> isinstance(mock, SomeClass)
True
>>> mock = Mock(spec_set=SomeClass())
>>> isinstance(mock, SomeClass)
True

поэтому мой пример кода будет выглядеть так:

m = mock.MagicMock(spec=bpgsql.Connection)
isinstance(m, bpgsql.Connection) 

это возвращает True

Все это говорит о том, что я не спорю о строгой проверке типов в python, я говорю, что если вам нужно проверить это, вы можете сделать это, и это также работает с тестированием и макетом.

Ответ 2

Это более или менее точно, почему вы не должны применять строгую проверку typecheck! Вы должны полностью удалить эту строку из кода.

Если вы не хотите этого делать, напишите абстрактный базовый класс со свойствами, которые вы хотите иметь (.connect(), .cursor(),...?) и проверьте isinstance этого.

Также <> устарел для aaages. Используйте !=.